Compiler construction rand()如何选择一个数字?
可能重复:Compiler construction rand()如何选择一个数字?,compiler-construction,programming-languages,Compiler Construction,Programming Languages,可能重复: 我不确定任何编程语言中的rand()函数或类似函数何时返回完全“逻辑”的值。因为它们不是基于时间、小时、天或其他什么,我想知道他是如何选择数字的。有人能回答我吗 谢谢,布鲁诺·阿拉诺。这取决于算法。维基百科总结了一种通过计算创建“随机数”的方法 m_w=;/*不能为零*/ m_z=;/*不能为零*/ 你不能得到随机数 { m_z=36969*(m_z&65535)+(m_z>>16); m_w=18000*(m_w&65535)+(m_w>>16); return(m_z它取决于
我不确定任何编程语言中的rand()函数或类似函数何时返回完全“逻辑”的值。因为它们不是基于时间、小时、天或其他什么,我想知道他是如何选择数字的。有人能回答我吗
谢谢,布鲁诺·阿拉诺。这取决于算法。维基百科总结了一种通过计算创建“随机数”的方法
m_w=;/*不能为零*/
m_z=;/*不能为零*/
你不能得到随机数
{
m_z=36969*(m_z&65535)+(m_z>>16);
m_w=18000*(m_w&65535)+(m_w>>16);
return(m_z它取决于所链接库的实现。POSIX.1-2001给出了以下rand()和srand()的实现示例,在两台不同机器上需要相同序列时可能有用
static unsigned long next = 1;
/* RAND_MAX assumed to be 32767 */
int rand(void) {
next = next * 1103515245 + 12345;
return((unsigned)(next/65536) % 32768);
}
void srand(unsigned seed) {
next = seed;
}
实际上,rand的大多数实现在某种程度上是基于时间的。通常,在创建随机数时,可以传入一个种子。同一个种子将生成相同的随机数字符串。如果没有传入种子,大多数实现将从当前系统时间创建一个种子。这取决于算法thm实现。但是,实现必须是确定性的,例如LCG算法
此确定性算法的周期取决于为公式选择的值,种子本身通常是一个时间戳+常量。您可以在此wikipedia页面中找到某些语言的LCG实现:
非确定性数字生成器,如Java
中的SecureRandom
使用与硬件相结合的算法来尝试生成真正的随机数通常它使用线性同余PRNG,这意味着存在一个状态数s
(您可以将其种子设定为某个初始值),在每一个回合中,你都要计算一些固定的常数,如果你选择好这些常数,得到的数字看起来是非常“随机”的。当然,还有很多其他的算法,但是这个算法特别简单。
static unsigned long next = 1;
/* RAND_MAX assumed to be 32767 */
int rand(void) {
next = next * 1103515245 + 12345;
return((unsigned)(next/65536) % 32768);
}
void srand(unsigned seed) {
next = seed;
}