Random rand()函数的随机性如何?

Random rand()函数的随机性如何?,random,Random,更具体地说,我的问题是,给定无限长的时间,int(rand()*1000)最终会击中0到999之间的每个数字吗?那么10^4,10^5。。。我猜一旦你在内存中输入了大小,它肯定会被破坏,也就是说,如果rand()返回一个浮点,也就是说内存中有n位,那么你不可能输入超过n个不同的整数,所以一旦你输入了rand()*(2^n+1),你肯定会错过一些。是的,给定无限时间,它将击中你范围内的每一个数字,只要它有一个无限周期;一旦再次达到种子值,序列将重复。当然,正如您所提到的,rand()返回的值的精度

更具体地说,我的问题是,给定无限长的时间,
int(rand()*1000)
最终会击中0到999之间的每个数字吗?那么10^4,10^5。。。我猜一旦你在内存中输入了大小,它肯定会被破坏,也就是说,如果rand()返回一个浮点,也就是说内存中有n位,那么你不可能输入超过n个不同的整数,所以一旦你输入了
rand()*(2^n+1)
,你肯定会错过一些。

是的,给定无限时间,它将击中你范围内的每一个数字,只要它有一个无限周期;一旦再次达到种子值,序列将重复。当然,正如您所提到的,rand()返回的值的精度会受到限制,最终会达到一个临界点,即它无法映射到足够大范围内的每个整数。但是如果你考虑一个具有无限精度和周期的理论计算机(你带来无穷大),那么你将在给定的范围内按给定的时间命中每一个数字。
但是,rand()使用的LCG不能提供统一的数字分布。也就是说,你会得到比其他数字更高频率的数字命中率(尽管无限时间你会命中所有数字,因为无限就是那么酷)。如果您需要均匀分布,则使用类似Mersenne Twister算法的方法。Boost库中有一个随机生成器,具有Mersenne Twister,易于实现。

没有唯一的
rand()
函数;它可以因语言而异,对于某些语言,也可以因实现而异。请更准确地说明您所询问的语言和平台。您能指出您所谈论的
rand()
设施吗?语言、图书馆等。。。一般来说,您是对的,可能输出的数量不能大于可能输入的数量。大多数语言都使用LCG作为标准的rand(),这是因为它具有轻量级的特性,尽管有些语言有更多的选项。在每种语言中可能不是LCG,但LCG非常常见。@Zach,我的观点是这个问题没有足够的细节来回答。例如:Python目前使用Mersenne Twister,而不是线性同余生成器。这个
rand()
调用到底有多少种可能的结果?它是一个单,一个双,一个分数吗?在不知道这些细节的情况下,你只是在猜测。这个问题更多的是关于随机生成器的理论性问题,否则就不会提到无限时间,你可以概括你的答案来解释不同的生成器,给出更常见的生成器的示例,例如LCG和MT。此外,您也可以以通用的方式处理精度,因为这些算法是针对精度而通用的(最终寄存器的大小将比目前更大)。根据随机性的性能或质量是否是更高的优先级,您可能希望相应地选择算法,并且还有比LCG和MT更多的选项。此外,任何人都可以轻松地设计出一个低质量的生成器,如漫画中所示。还有无数的算法。。。