【问题标题】:Generate Random Number Using C使用 C 生成随机数
【发布时间】:2014-09-21 21:16:32
【问题描述】:

以下代码中的 srand(time(NULL)) 行如何生成随机数? 时间在这里是什么意思?

#include <stdio.h>  
#include <stdlib.h>
#include <time.h>
int main ()
{
    int iSecret, iGuess;
    srand (time(NULL));

    iSecret = rand() % 10 + 1;

    do {
        printf ("Guess the number (1 to 10): ");
        scanf ("%d", &iGuess);
        if (iSecret < iGuess) 
            puts ("The secret number is lower");
        else if (iSecret > iGuess) 
            puts ("The secret number is higher");
    } while (iSecret != iGuess);
    puts ("Congratulations!");
    return 0;
}

【问题讨论】:

标签: c random


【解决方案1】:

根据链接What is time(NULL) in C?中的详细信息

You can pass in a pointer to a time_t object that time will fill up with the current time (and the return value is the same one that you pointed to). If you pass in NULL, it just ignores it and merely returns a new time_t object that represents the current time.

time(NULL) 只返回当前时间详细信息。

srand()用于生成随机数。

srand(time(NULL)) 只是创建一个随机数,使用当前时间详细信息作为输入。

【讨论】:

    【解决方案2】:

    当您没有使用srand() 生成随机数时,无论何时编译您的程序,您都会得到与输出相同的数字!这里srand()rand() 的种子。

    srand (time(NULL)); 
    

    世界上的时间通常不是一个稳定的时间,所以每一秒都在变化!这样时间它将以秒为单位提供更新的时间作为种子。所以你会得到不同的随机数作为输出!

    但是,当您使用time() 作为种子时,当您在一秒钟内多次运行程序时,您可能会得到与输出相同的数字,之后每秒钟只会给出不同的输出。 为避免此错误,请使用以下方式-

    srand (getpid()); // Best one
    

    当您运行程序时,进程 ID 会有所不同!所以在这种方法中,如果你在一秒钟内多次运行你的程序,你永远不会得到相同的数字!

    【讨论】:

      【解决方案3】:

      它为随机数生成器播种,因为它是完全确定的,并且每次都会给出相同的值,除非播种。

      time 是标准 C 函数,它返回自纪元以来经过的当前时间。

      由于这篇文章被标记为 C++,我建议不要使用这些函数并将时间投入到the pseudo-random non-deterministic random number generators available to you

      【讨论】:

        【解决方案4】:

        srand 函数种子伪随机数生成器,这意味着对于srand(seed); 中的相同seed,您将始终获得相同的随机数序列。

        但是当你使用固定的seed 时,这会让你总是得到相同的随机数序列。因此,为了消除“随机性”的错觉,您可以将种子设置为 a 值,每次运行程序时都会有所不同。使用time(NULL) 是为每次运行提供不同种子的最简单方法。

        【讨论】:

          【解决方案5】:

          您可以在reference 中找到 srand 函数,它用于从作为参数传递的种子开始初始化伪随机数生成器。 如果将空指针 (NULL) 传递给 time 函数,它只返回当前日历时间,这就是为什么它用于为时间函数生成种子。事实上,当前时间经常变化。

          【讨论】:

            【解决方案6】:

            随机数确实是伪随机数。

            生成机制需要一个种子。 所以不必每次都采用相同的种子(这将始终产生相同的随机数序列),如果您采用与时间相关的种子,那么您总是有一个新的种子,它允许生成不同的随机数。

            srand (time(NULL)); 就是这样做的。

            【讨论】:

              猜你喜欢
              • 2013-11-09
              • 2012-05-20
              • 2012-03-18
              • 2015-07-19
              • 1970-01-01
              • 2012-03-20
              • 1970-01-01
              相关资源
              最近更新 更多