可能重复:
How does rand() work? Does it have certain tendencies? Is there something better to use?
我不确定 rand()函数或任何编程语言中的类似函数何时返回一个完全“逻辑”的值。因为它们不是基于时间,小时,天或某事我想知道他如何选择数字。有人可以回答我吗?
谢谢,Bruno Alano。
答案 0 :(得分:2)
这取决于algorthmn。维基百科总结了计算创建“随机数”的一种方法 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 :(得分:1)
实际上,rand 的大多数实现都是以某种方式基于时间的。通常,在创建随机数时,您可以传入种子。相同的种子将产生相同的随机数字串。如果没有传入种子,大多数实现都会从当前系统时间创建种子。
答案 2 :(得分: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;
}
答案 3 :(得分:0)
这取决于算法实现。但实施必须是确定性,例如LCG算法。
此确定性算法的周期取决于为公式选择的值,种子本身通常是时间戳+常量。您可以在此维基百科页面中找到某些语言的LCG实现:
SecureRandom
中的Java
等非确定性数字生成器使用与硬件结合的算法尝试生成真正的随机数