C# Mono使用随机方法获得相同的序列

C# Mono使用随机方法获得相同的序列,c#,delegates,mono,C#,Delegates,Mono,当我在Mono中运行以下代码时,而不是在MonoDevelopIDE中使用Microsoft的C。我每次都会得到相同的随机数序列00111110110001001。如果我将范围更改为其他值,例如r.Next0,5,那么我会得到随机值。我觉得这很奇怪。。这是虫子还是我在做傻事 注意:似乎有时这些数字是否定的。。e、 我偶尔会看到11000000001001110110 using System; namespace TestRNG { class MainClass {

当我在Mono中运行以下代码时,而不是在MonoDevelopIDE中使用Microsoft的C。我每次都会得到相同的随机数序列00111110110001001。如果我将范围更改为其他值,例如r.Next0,5,那么我会得到随机值。我觉得这很奇怪。。这是虫子还是我在做傻事

注意:似乎有时这些数字是否定的。。e、 我偶尔会看到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();
        }
    }
}
这不是随机调用实例上的下一个调用,因为它们被调用的距离太近,因此使用来自系统时钟问题的相同种子进行播种

使用以下代码:

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。接下来返回的值,是我经常看到的相同的旧值。这让我相信俄罗斯人?那个之前贴出答案并被否决的家伙是正确的,他随后删除了他的答案。例如,见


根据下面的一条注释,这可能只是一个mono实现问题。

通过使用Guid类,您可以生成更多的随机数,而不会对性能产生更大的影响:


编辑:每次获取相似值的问题是因为随机。其次是从当前系统时钟获取值,因此每次编译生成不同值的时间可能没有太大差异。尝试在循环中运行代码,值应该更加多样化。

好吧,扩展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类都会生成一个不同的数字,因此我对随机数使用不同的种子。

在Windows上运行此操作会产生不同的0和1序列。每次都会这样吗?你每次跑步的时候它们都不一样吗?。您是使用mono还是C运行。mono中的RNG实现可能很差?不,我们的俄罗斯朋友错了。当取模2时,序列显然不是随机的。换句话说,r.Next给你一个随机的位序列,除了最后一位-最后一位总是可预测的。这似乎是一个mono实现的问题,在Windows中代码很好。我已经将它从C重新标记为mono,并修复了标题,这样我就不会让C语言的人感到困惑了。我还向mono发布了一个bug报告。我想我们的俄罗斯朋友的观点是,生成的随机数的低阶位缺乏随机性。我怀疑这可能是这里的原因。事实上,关于我们的俄罗斯朋友,你可能是对的,如果他用模,那也没用。我记不起他的名字,也记不起他发的确切文字。右移似乎确实有帮助。你应该把[c]标记加回去——仅仅因为它是[mono]并不意味着它不是[c]。[mono]只是CLR的linux实现,其中包括[c]。这并不比以前更随机。这只是一粒不同的种子。随机数生成器没有更改。我使用此种子获得的字符串与隐式系统时间种子不同。。但它仍然会在不同的迭代中重复。这就是我期望从不同的种子中得到的结果。但是通过随机选择种子,你每次都可以得到不同的值。我的例子不能解决这个问题吗?@swistak-不,不能。OP明确表示这不是种子问题。这似乎是一个单声道实现问题,因为OP的代码在Windows.Random.Next中工作正常。它不从系统时钟获取其值。如果使用默认构造函数实例化Random,它将从系统时钟获取种子。从这一点开始,生成的值是确定的。每次都创建一个新的随机值。这不是应该使用的方式,我不相信。是的,但就不会影响内存而言,因为随机对象的范围是我创建它们的方法。返回随机值后,创建的对象可供垃圾收集器使用。并且,如果您的问题确实是单开发问题,那么这至少可以作为“解决办法”:所有这些都是正确的。但是,分配和释放可能大量的随机对象会带来时间开销。它做的工作比它需要的要多。这不是一个单一开发错误。。可能是一只单声道臭虫。
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());
    }

}
}