【发布时间】:2012-11-26 14:19:17
【问题描述】:
今天,我的朋友有一个想法,使用生成的伪随机数多次设置伪随机数生成器的种子,以“使事情更随机化”。
C# 中的示例:
// Initiate one with a time-based seed
Random rand = new Random(milliseconds_since_unix_epoch());
// Then loop for a_number_of_times...
for (int i = 0; i < a_number_of_times; i++)
{
// ... to initiate with the next random number generated
rand = new Random(rand.Next());
}
// So is `rand` now really random?
assert(rand.Next() is really_random);
但我认为这可能会增加将重复种子用于伪随机数生成器的机会。
这个
- 让事情更加随机化,
- 使其循环使用一定数量的种子,或
- 对随机性没有任何作用(即既不增加也不减少)?
有没有哪位伪随机数生成器方面的专家能给出详细的解释,好让我的朋友信服?我很高兴看到答案解释了一些伪随机数生成器算法的更多细节。
【问题讨论】:
-
ou... 您最好的选择是 (xkcd) 掷一次骰子,然后简单地将其用作常数。 Nahw 只是在开玩笑——计算机就是不能很好地生成随机数。每个非伪随机都使用外部(如物理测量)源进行初始化和随机性......所以恕我直言,在应用程序中使用 time.h 之类的其他东西(就像你已经做过的那样)是不值得的。如果您确实需要随机数,请考虑为这些使用硬件
-
@Najzero 好吧,只是想了解更多关于伪数发生器的信息,所以我不会为此购买核衰变探测器。 :)
-
ffffshhh...不再承诺,其他一切都差不多xkcd.com/221
标签: random