可能重复:
Random number generator not working the way I had planned (C#)
Why does it appear that my random number generator isn't random in 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
每次我以相同的顺序获得相同的值。我不明白为什么&gt;请帮忙
祝你好运, 的Dawid
答案 0 :(得分:3)
问题是你每次都在创建一个新的随机数。创建Random类的实例时,它将当前时间用作种子。如果您非常快速地多次执行此操作,则会获得相同的种子值,因此不同的Random实例会输出相同的结果。
为了解决这个问题,您需要确保每次都将随机播种,或共享并使用单个Random实例。最简单的选择是将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来增加它并从每个实例中播种一个新的随机数等。)
答案 1 :(得分:0)
Random是伪随机数生成器,这意味着任何给定种子的输出序列都是相同的。如果将种子传递给构造函数,则会得到不同的序列。
答案 2 :(得分:0)
据我所知,除非另有说明,否则系统时间会随机播种。它根据此数字生成数字。当你几乎完全同时创建它们时,它们具有相同的种子并且几乎总是返回相同的数字和序列。
任何简单的修复方法都是创建一个静态随机的所有实例共享,并在该静态对象上调用.Next()。
答案 3 :(得分:0)
“使用无参数构造函数以紧密连续的方式创建不同的随机对象,创建随机数生成器,生成相同的随机数序列。”