计算机时钟作为伪随机发生器

标签 c random generator

大多数现代计算机都表现出不确定性行为,这使得无法判断两次连续调用读取计算机时钟之间会发生多少个时钟周期。

以下代码是使用计算机时钟的一个字节的伪随机数生成器。

unsigned long occurrences = 0;
unsigned long total = 0;

while (true) {
    if ((clock() & 0xFF) == 60) // testing ocurrences for a given number, 60 for instance
        occurrences++;
    total++;
    printf("%f\n", (float)occurrences / (float)total ); // this should be approximately 1/256 = 0.00390625
}

除了像加密这样的严肃应用程序之外,它还可以用于游戏的移动平台。

我想知道这种实现的优点和缺点是什么。

最佳答案

您缺少使用 rand() 的正确方法,或者更具体地说,使用 srand()

您需要在程序运行期间精确调用srand()一次。 不要在循环中调用srand()。 不要在每次调用 rand() 之前调用 srand()。 确保正确的 srand() 管理的最佳方法是在 main() 函数中调用一次,然后忘记它:只需使用 rand() 之后。

#include <stdlib.h> /* rand, srand */
#include <time.h>   /* time */

int main(void) {
    /* initialization */
    srand(time(NULL));

    /* input, possibly calling rand() */

    /* process, possibly calling rand() */

    /* output, possibly calling rand() */

    /* termination */
    return 0;
}

关于计算机时钟作为伪随机发生器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14117229/

相关文章:

c++ - 使用 rand() 在 C++ 中进行线性分布

rust - 生成器似乎没有公开 `resume()` 方法

Python 笛卡尔幂发生器在幂列表上

python - 如何以 Python 方式从列表中生成所有值?

C:sizeof()相关疑惑?

c - 段错误检查 strcmp

c - 进程与消息队列的通信

java - 随机 2D 城市景观生成器,如何随机生成?

c - 我从 printf ("%d") 得到的输出是什么意思?

unit-testing - 使用随机输出测试函数