为什么rand()总是返回相同的值?

9

我正在尝试生成随机数,但是我不断地得到数字41。这个简单的片段可能出了什么问题?

可能重复:
在C语言中生成随机数
使用rand生成随机数

#include <stdio.h>
#include <stdlib.h>

int main(void)
{
    int a = rand();
    printf("%d",a);
    return 0;
}

感谢您的帮助。

1
这个问题在SO上已经被问了很多次;搜索"C语言中的随机数"会得到很多答案。我提供的链接与你的完全相同,甚至产生了41 - Brian Roach
我很确定41是随机选择的。 我只是尝试选择一个随机数字,没有得到41。 - Kerrek SB
8
如此接近,42会更好... - Felix Kling
@FelixKling 当然。这段代码本质上存在问题,因为它给出的结果是41而不是42。 - Marlon
+1 @FelixKling - 我想知道有多少人真正理解你的意思? - Java42
1
@Chuck:我认为这就是其中的乐趣之一 :) 但由于这是一个旨在教授知识的网站:http://www.youtube.com/watch?v=D6tINlNluuY - Felix Kling
2个回答

23
您需要提供不同的种子,例如:
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
int main(void)
{
    int a;
    srand ( time(NULL) );
    a = rand();
    printf("%d",a);
    return 0;
}

4

您需要给生成器提供种子。

这是预期的。原因是为了结果的可重复性。假设您正在使用随机序列进行某些测试,而您的测试在特定时间或迭代后失败。如果您保存种子,则可以重复测试以进行复制/调试。使用毫秒级别的时代当前时间作为种子,您将得到所期望的随机数(并保存种子,如果您认为需要重复结果)。


当我使用 srand(12) 时,数字会变化,但仍保持不变。 - Umut
@UmutŞenaltan:使用相同的值进行种子处理将会创建相同的随机序列。请参阅https://en.wikipedia.org/wiki/Pseudorandom_number_generator。 - Greg Hewgill
1
这是预期的。原因是为了结果的可重复性。假设您正在使用随机序列进行某些测试,并且在特定时间或迭代次数后测试失败。如果保存种子,您可以重复测试以进行复制/调试。使用毫秒级别的当前时代从起点开始的种子,您将获得所需的随机数(并保存种子,如果您认为需要重复结果)。 - Java42

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接