相同的随机值

本文关键字:随机 | 更新日期: 2023-09-27 18:17:29

可能的重复项:
随机数生成器未按我计划的方式工作 (C#(
为什么我的随机数生成器在 C# 中看起来不是随机的?

我对随机值有问题

        int weight = 0;
        Random random = new Random();
        for (int i = 0; i < entriesCount; i++)
        {
            weight = random.Next(10);
        this.weights[i] = weight;
        }

此代码在我的对象的构造函数中。我创建3个不同的对象

Object object1 = new Object(2);
Object object2 = new Object(2);
Object object3 = new Object(2);

对于每个对象,我都会得到相同的随机值,例如:4, 5 | 4, 5 | 4, 5

每次我以相同的顺序获得相同的值。我不明白为什么>请帮忙

此致敬意达维德

相同的随机值

问题是你每次都在创建一个新的随机。 创建 Random 类的实例时,它使用当前时间作为种子。 如果非常快速地多次执行此操作,则会获得相同的种子值,因此不同的随机实例输出相同的结果。

为了解决此问题,您需要确保每次都唯一地设定随机数,或者共享和使用单个随机实例。 最简单的选择是将随机实例设置为静态:

class YourClass
{
    private static Random randomGenerator = new Random();
    public YourClass(int entriesCount)
    {
       int weight = 0;
       for (int i = 0; i < entriesCount; i++)
       {
           weight = randomGenerator.Next(10);
           this.weights[i] = weight;
       }
    }
    // .. rest of your class

这将导致类始终重用相同的 Random 实例,因此您每次都会获得不同的值。

请注意,如果要在多线程方案中使用它,则还必须同步对随机实例的访问,或者提出不同的方法(例如保存种子值,并使用类似Interlocked.Increment之类的东西来递增它并从每个实例中播种一个新的随机数等(。

随机是一个伪随机数生成器,这意味着任何给定种子的输出顺序都是相同的。 如果将种子传递给构造函数,则会得到不同的序列。

据我所知,除非您另有指定,否则随机数是由系统时间播种的。它根据此数字生成数字。当您几乎完全相同地同时创建它们时,它们具有相同的种子,并且几乎总是返回相同的数字和序列。

任何简单的解决方法都是创建一个所有实例共享的静态随机数,然后调用 .Next(( 在该静态对象上。

来自 MSDN 文档:

"使用无参数构造函数紧密连续创建不同的随机对象会创建随机数生成器,这些生成器会产生相同的随机数序列。">