Code for Random无法正常工作

时间:2015-07-17 13:25:13

标签: c# random windows-phone-8.1

我正在创建一个随机函数,给我四个随机值A,B,C,D和符号(+, - )。问题是代码生成所有相同的值,并且我得到的输出只有A = B = C = D = x其中x是代码生成的任何随机值。此外,我试图把断点和调试它,它没有问题,但一旦我删除断点,同样的问题发生。谁能告诉我哪里出错了。代码如下:

public void RandomQuestionGenerate()
    {//all the variables(A,B,C,D,sign1,sign2) are globally defined
        Random FirstNo = new Random();
        A = FirstNo.Next(0, 10);
        Random SecondNo = new Random();
        TextA.Text = A.ToString();

        B = SecondNo.Next(0, 10);
        Random ThirdNo = new Random();
        TextB.Text = B.ToString();

        C = ThirdNo.Next(0, 10);
        Random FourthNo = new Random();
        TextC.Text = C.ToString();

        D = FourthNo.Next(0, 10);
        TextD.Text = D.ToString();

        Random FirstSign = new Random();
        int x = FirstSign.Next(0, 2);
        if(x == 0)
        {
            Sign1 = "+";
        }
        else if(x == 1)
        {
            Sign1 = "-"; 
        }
        TextSign1.Text = Sign1;


        Random SecondSign = new Random();
        int y = SecondSign.Next(0, 2);
        if (y == 0)
        {
            Sign2 = "+";
        }
        else if (y == 1)
        {
            Sign2 = "-";
        }
        TextSign2.Text = Sign2;
    }

3 个答案:

答案 0 :(得分:1)

您应该只有一个 Random的实例,最好是整个程序。

使用默认构造函数创建

Random时会自动为其添加基于时间的值:

  

使用与时间相关的默认种子值初始化Random类的新实例。

https://msdn.microsoft.com/en-us/library/h343ddh9(v=vs.110).aspx

问题是,您创建这四个实例的速度比此基于时间的值的解析速度快。因此,所有四个实例都以相同的值播种。当使用相同的参数调用时,每个参数都将返回相同的值。

由于这样的竞争条件,如果可能的话,你应该只保留一个Random的全局实例。

答案 1 :(得分:1)

使用一个实例并致电.Next。您的问题是所有Random个实例的种子都是相同的(它默认为基于时间的种子)。

实现只是一种算法,需要一个起始值来开始导出其他随机的"价值来自。它根本不是随机的,你可以弄清楚知道种子和所用算法的价值。

答案 2 :(得分:1)

每次都不要创建新的Random实例。

保留一个Random个实例,并为每个新的随机数调用Next()

有关详细信息,请参阅this SO question