gpt4 book ai didi

c# - 随机数生成器只生成一个随机数

转载 作者:行者123 更新时间:2023-11-30 18:40:23 25 4
gpt4 key购买 nike

我有以下功能:

//Function to get random number
public static int RandomNumber(int min, int max)
{
Random random = new Random();
return random.Next(min, max);
}

我怎么调用它:

byte[] mac = new byte[6];
for (int x = 0; x < 6; ++x)
mac[x] = (byte)(Misc.RandomNumber((int)0xFFFF, (int)0xFFFFFF) % 256);

如果我在运行时使用调试器执行该循环,我会得到不同的值(这正是我想要的)。但是,如果我在该代码下方两行放置一个断点,则 mac 数组的所有成员都具有相同的值。

为什么会这样?

最佳答案

每次执行 new Random() 时,它都会使用时钟进行初始化。这意味着在紧密循环中,您会多次获得相同的值。你应该保留一个 Random实例并继续使用 Next相同实例上。

//Function to get a random number 
private static readonly Random random = new Random();
private static readonly object syncLock = new object();
public static int RandomNumber(int min, int max)
{
lock(syncLock) { // synchronize
return random.Next(min, max);
}
}

编辑(见评论):为什么我们在这里需要一个

基本上,Next 将改变Random 实例的内部状态。如果我们同时从多个线程执行此操作,您可能会争辩说“我们只是让结果更加随机”,但我们实际上正在做的可能是打破内部实现,我们也可以开始从不同的线程获取相同的数字,这可能是个问题 - 也可能不是。不过,保证内部发生的事情是更大的问题;因为 Random 对线程安全做出任何保证。因此有两种有效的方法:

  • 同步以便我们不会同时从不同线程访问它
  • 每个线程使用不同的随机实例

两者都可以;但是同时互斥来自多个调用者的单个实例只是自找麻烦。

lock 实现了这些方法中的第一个(也是更简单的);然而,另一种方法可能是:

private static readonly ThreadLocal<Random> appRandom
= new ThreadLocal<Random>(() => new Random());

这是每个线程,所以你不需要同步。

关于c# - 随机数生成器只生成一个随机数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8337791/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com