Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/redis/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Compiler construction rand()如何选择一个数字?_Compiler Construction_Programming Languages - Fatal编程技术网

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;
}