我正在使用Mersenne twister算法来洗牌。每次需要洗牌时,我都会将time(NULL) + deckCutCardNumber作为种子,这是用户选择切牌的地方。如果只在第一手中播种,并继续用相同的种子生成它们,我会得到更好的结果吗?还是这种方法更随机?
谢谢
发布于 2011-09-06 21:43:42
假设用户没有打乱时钟(或者仔细地将他们的截取数字精确地减少已过的时间),他们无论如何都不会看到PRNG的重复状态,所以你所做的没有太大的区别。在重新播种后,您将从任何种子值*以及在任何可行的步骤中获得Mersenne Twister的合理分布。
但是,如果你想重新播种,你可以通过播种时间,加上用户选择的数字,再加上在重新播种之前从生成器中获得的输出,来结合这两种方法。这将PRNG的当前状态与新的种子数据(部分,而不是全部)结合在一起,因此在某种程度上,过去的所有时间和截取值(以及PRNG的使用次数)都会影响状态,而不仅仅是最近的。以这种方式将更多的信息倾注到种子值中可以被认为比种子包含更少的信息,因此更少的似是而非的值。
关于Mersenne Twister的唯一特别之处是,如果你能观察到它的600多个输出,那么你就可以推断它的内部状态,并预测输出的其余部分,直到它被重新播种。话又说回来,你可能不会使用MT的应用程序,这类事情很重要:如果你以任何方式依赖重新播种,那么你可能应该首先使用更安全的PRNG。显然,如果用户能够预测PRNG之外的值,这对您的应用程序来说并不重要,因为用户和您一样了解时间。所有这些都告诉您,它是如何播种的并不重要,只要它不是用完全相同的值播种,以便两个游戏是相同的即可。因此,它是否重新播种也无关紧要。
*严格来说,这不是真的,MT有几类弱种子。但只要您在播种时考虑到这一点(例如,在使用前对种子进行散列,以便不好的值不太可能偶然出现),您就可以解决这个问题。
发布于 2011-09-06 21:44:28
仅对PRNG设定一次种子。生成的序列的统计属性仅在种子之后得到保证。如果每次都重新设定种子,则生成的序列可能没有任何可预测的统计属性。
例如,考虑一个PRNG,它总是返回种子值本身作为序列中的第一个数字,但它在其范围内是完全一致的。只要你不使用第一个数字,这就构成了一个很好的PRNG。然而,如果你在每次使用之前重新播种,比如说递增计数器值,你根本就没有随机性!
发布于 2011-09-06 21:39:33
它既不是随机的,也不是随机的。这并不是真正的随机,但如果你每次都重新播种,你不会注意到任何区别。
但是,我建议不要使用它,因为time返回一个无符号的整数,所以如果您在同一秒内调用它两次,您将得到相同的数字,因此从RNG中也会得到相同的数字。然后是分布和所有这些。
https://stackoverflow.com/questions/7320840
复制相似问题