-1

这段代码每次都会给出一个随机输出,但由于某种原因,输出非常相似:这是代码:

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

请帮忙。

4

3 回答 3

3

Jon Skeet 在他的这篇文章中解释了这个问题。核心问题是这样的:

如果您启动一个具有相同初始状态(可以通过种子提供)的 Random 实例并对其进行相同的方法调用序列,您将获得相同的结果。

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

于 2013-11-08T11:07:01.090 回答
3

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

于 2013-11-08T11:07:37.837 回答
1

您没有解释您希望此代码做什么。似乎想生成 500 次,-1或者+1最后添加所有 500 个数字。

我不知道您为什么要这样做,因为它会在许多情况下返回相同的值,而 arrays-of-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。因此,无论您调用多少次,结果都不会有太大差异。

也许如果你解释你的最终目标是什么,你就能得到更好的答案。

于 2013-11-08T11:02:37.507 回答