使用C生成随机数

时间:2014-07-30 09:31:39

标签: c random

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

6 个答案:

答案 0 :(得分:1)

随机数确实是伪随机数。

生成机制需要种子。 因此,不要每次都使用相同的种子(这将产生相同的随机数序列),如果你将种子与时间相关联,那么你总是有一个新的种子,这允许生成不同的随机数。

srand (time(NULL));确实存在这种情况。

答案 1 :(得分:1)

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

但是当你使用固定的seed时,这将使你总是得到相同的随机数序列。因此,为了帮助实现&#34; randomness&#34;,你可以将种子设置为一个值,每次运行程序时都会有所不同。使用time(NULL)是为每次运行提供不同种子的最简单方法。

答案 2 :(得分:0)

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

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

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

答案 3 :(得分:0)

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

答案 4 :(得分:0)

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

srand (time(NULL)); 

通常情况下,世界上的时间不是一个稳定的,所以它每秒都会变化!所以这个时间它将作为种子在几秒钟内给出更新时间。所以你会得到不同的随机数作为输出!

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

srand (getpid()); // Best one

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

答案 5 :(得分:0)

根据链接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))只使用当前时间详细信息作为输入创建一个随机数。