此代码每次都会发出一个随机输出,但是对于某些原因,输出非常相似: 这是代码:
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
请帮助。
答案 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
。所以无论你多少次这样称呼,结果都不会有那么大差异。
也许如果你解释一下你的最终目标是什么,你可以得到更好的答案。