rand() 如何选择一个数字? [重复]

问题描述 投票:0回答:4

可能重复:
rand() 是如何工作的?它有一定的倾向吗?有没有更好用的?

我不确定任何编程语言中的 rand() 函数或类似函数何时返回完全“逻辑”的值。因为它们不是基于时间、小时、天或其他东西,我想知道他如何选择数字。有人可以回答我吗?

random
4个回答
2
投票

这取决于算法。 维基百科总结了一种计算创建“随机数”的方法 http://en.wikipedia.org/wiki/Random_number_ Generation

m_w = <choose-initializer>;    /* must not be zero */
m_z = <choose-initializer>;    /* must not be zero */

uint get_random()
{
   m_z = 36969 * (m_z & 65535) + (m_z >> 16);
   m_w = 18000 * (m_w & 65535) + (m_w >> 16);
   return (m_z << 16) + m_w;  /* 32-bit result */
}

您现在可以购买硬件随机数生成器来产生更好的随机数


1
投票

实际上,rand 的大多数实现都是以某种方式基于时间的。 通常,在创建随机数时,您可以传入种子。 相同的种子将产生相同的随机数字串。 如果没有传入种子,大多数实现都会从当前系统时间创建种子。


0
投票
这取决于您链接的库的实现。 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; }
    

0
投票
这取决于算法的实现。然而,实现必须是

确定性,例如 LCG 算法。

这种确定性算法的周期取决于为公式选择的值,种子本身通常是时间戳+常量。您可以在此维基百科页面中找到某些语言的 LCG 实现:

LCG算法

非确定性数字生成器,例如

SecureRandom

中的
Java
,使用算法与硬件相结合来
尝试生成真正的随机数

© www.soinside.com 2019 - 2024. All rights reserved.