c#循环100次,但输出相似,即使它应该是随机的

时间:2013-11-08 11:01:27

标签: c#

此代码每次都会发出一个随机输出,但是对于某些原因,输出非常相似: 这是代码:

using System;
using System.Collections.Generic;
namespace dimensionrandomwalk
{
    class MainClass
    {
        public static void Main (string[] args){

            for(int p = 0; p<100; p++){
        {
            Random rnd = new Random();
            int[] x;
            x = new int[500];
            for (int i = 0; i < 500; i++){
                int L = rnd.Next (0, 2);

                x[i] = (L==0) ? -1 : 1;
            }

            int total_value = 0;
            for (int i = 0; i < 500; i++)
                 total_value += x[i];

                 Console.WriteLine ("Total: " + total_value);
                 }
     }
    }
 }
}

这是输出: http://gyazo.com/a0f11edd17eff6dde8523ac4dbf19629.png

请帮助。

3 个答案:

答案 0 :(得分:3)

Jon Skeet在this article of his中解释了这个问题。核心问题是:

  

如果你以相同的初始状态(可以通过种子提供)开始一个Random实例并在其上进行相同的方法调用序列,你将得到相同的结果。

     

那么我们的示例代码出了什么问题?我们在循环的每次迭代中使用了一个新的Random实例。 Random的无参数构造函数将当前日期和时间作为种子[...]

答案 1 :(得分:3)

new Random()创建一个基于时间播种的新Random对象。由于循环每秒会运行很多次,所以它实际上并没有改变。相反,您应该创建一次Random对象并反复调用同一个对象,它将在表中移动而不是采用相同的值,从而为您提供所需的伪随机值。

答案 2 :(得分:1)

您没有解释您希望此代码执行的操作。 似乎就像要生成500次-1+1,最后添加所有500个数字。

我不知道你为什么这样做,因为它会有很多情况会返回相同的值,而500的数组包含差异。比较(简化为5个元素而不是500个):

{ +1, +1, -1, -1, +1 },
{ +1, -1, +1, -1, +1 },
{ -1, +1, -1, +1, +1 },
{ -1, -1, +1, +1, +1 }

当您在计算+1的循环中累加时,所有四个都会返回total_value。所以无论你多少次这样称呼,结果都不会有那么大差异。

也许如果你解释一下你的最终目标是什么,你可以得到更好的答案。