我读过它与时间有关,你也可以从包含 time.h 中得到,所以我假设了这么多,但它究竟是如何工作的?此外,它是否有奇数或偶数之类的倾向?最后,在 C 标准库或 Foundation 框架中是否有更好的分布?
最佳答案
简要地:
time.h
得到一个种子,它是一个初始随机数。然后 C 对该数字进行一系列操作以获得下一个随机数,然后对该数字进行操作以获得下一个,然后......你得到了图片。 rand()
能够触及每一个可能的整数。无论输入种子如何,它都不会喜欢偶数或奇数,很高兴。尽管如此,它还是有限制的——它会相对较快地重复自己,并且几乎在每个实现中只给出最多 32767 的数字。现在,如果您对上述正确的原因感兴趣,这里是有关如何
rand()
的详细信息。作品:rand()
就是所谓的“linear congruential generator”。这意味着它采用了以下形式的方程:xn+1 = ( *a****xn + ***b* ) mod m
其中 xn 是第 n 个随机数, 和 b 是一些预定的整数。算术以 m 为模进行,m 通常为 232,具体取决于机器,因此在 xn+1 的计算中只保留最低的 32 位。
那么,在英语中,想法是这样的:要得到下一个随机数,将最后一个随机数乘以某物,再加上一个数字,然后取最后几位数字。
一些限制很快就会显现出来:
time.h
的地方。正在使用。由于我们想要一个真正的随机数,通常的做法是询问系统现在几点了(以整数形式)并将其用作第一个“随机数”。此外,这也解释了为什么使用相同的种子两次总是会给出完全相同的随机数序列。这听起来很糟糕,但实际上很有用,因为当您控制程序的输入时,调试会容易得多 好的部分是 LCG 喜欢
rand()
是非常非常低的足迹。它通常只需要 32 位来保持状态,这真的很好。它也非常快,只需要很少的操作。这些使其适用于非关键嵌入式系统、视频游戏、休闲应用程序等。PRNG 是一个引人入胜的话题。 Wikipedia如果您渴望了解有关历史或当今各种实现的更多信息,它始终是一个不错的去处。
关于objective-c - rand() 是如何工作的?它有某些倾向吗?有什么更好用的吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3539398/