单声道使用随机获得相同的序列

时间:2015-02-08 03:32:38

标签: c# delegates mono

当我在monodevelop IDE中运行Mono中的以下代码(而不是在Microsoft的C#中)时。我每次都得到相同的随机数序列(00111111110110001001)。如果我将范围更改为其他内容,例如r.Next(0,5)然后我得到随机值。这对我来说似乎很奇怪..这是一个错误还是我在做一些愚蠢的事情?

注意:有时这些数字似乎被否定了......例如我偶尔会看到11000000001001110110。

using System;

namespace TestRNG
{
    class MainClass
    {
        public static void Main (string[] args)
        {
            Random r = new Random ();
            for (int i = 0; i < 20; i++) {
                Console.Write(r.Next(0, 2));
            }
            Console.WriteLine();
        }
    }
}

这不是“调用Next()对Random的实例调用过于紧密,因此从系统时钟问题播种相同的种子”。

使用以下代码:

using System;

namespace TestRNG
{
    class MainClass
    {
        public static void Main (string[] args)
        {
            Random r = new Random (Guid.NewGuid().ToByteArray()[0]);
            for (int i = 0; i < 20; i++) {
                int rn = r.Next ();
                Console.WriteLine(rn + " " + (rn % 2));
            }
            Console.WriteLine();
        }
    }
}

我看到每次都得到rn的不同值,但是rn%2的值序列,这是我怀疑r.Next()返回的值,与我总是看到的旧值相同。这让我相信俄罗斯人?之前发布了一个答案并被拒绝投票给遗忘的人是正确的(他随后删除了他的答案)。例如,请参阅http://eternallyconfuzzled.com/arts/jsw_art_rand.aspx

根据下面的评论之一,这可能只是单声道实现。

2 个答案:

答案 0 :(得分:0)

嗯,延伸到swistak说的话(因为我也使用了Guid类),这是我为你的问题制作的代码,已经过测试并且有效:

using System;
using System.Linq;

namespace pruebaDeNumerosAleatorios
{
class MainClass
{
    public static int RandomNumber()
    {
        Random x = new Random(Guid.NewGuid().ToByteArray().First());
        return x.Next(0, 20);
    }
    public static void Main(string[] args)
    {
        for (int i = 0; i < 20; i++)
            Console.WriteLine(RandomNumber());
    }

}
}

如前所述,您不会给内部时钟(您用作种子)的时间在迭代之间进行更改,因此生成的数字是相同的。我在这里做的是实现Guid类,它生成一个'唯一'数字,将其转换为字节数组,并使用数组的第一个元素作为种子。 我在一个方法中这样做是因为这样可以保证每次调用该方法时,Guid类会生成一个不同的数字,所以我使用不同的种子作为随机数。

答案 1 :(得分:-3)

您可以生成&#34;更随机&#34;使用Guid类:

对数字的影响没有太大影响
Random r = new Random(Guid.NewGuid().ToByteArray()[0]);

编辑:每次获得类似值的问题是因为Random.Next()从当前系统时钟获取值,所以可能每次编译之间在生成不同值时没有太大的时间差异。尝试在循环中运行代码,值应该更加多样化。