C 为什么我总是用rand()得到相同的随机数序列?

C 为什么我总是用rand()得到相同的随机数序列?,c,random,C,Random,这是我第一次用C尝试随机数(我想念C)。这是我的密码: int i, j = 0; for(i = 0; i <= 10; i++) { j = rand(); printf("j = %d\n", j); } inti,j=0; 对于(i=0;i你必须播种。随着时间播种是个好主意: #包括 #包括 #包括 int main() { srand(时间(空)); printf(“随机数:%d\n”,rand()%100); 返回0; } 得到相同的序列是因为,若不调用s

这是我第一次用C尝试随机数(我想念C)。这是我的密码:

int i, j = 0;
for(i = 0; i <= 10; i++) {
    j = rand();
    printf("j = %d\n", j);
}
inti,j=0;

对于(i=0;i你必须播种。随着时间播种是个好主意:

#包括
#包括
#包括
int main()
{
srand(时间(空));
printf(“随机数:%d\n”,rand()%100);
返回0;
}
得到相同的序列是因为,若不调用
srand()
,则
rand()
会自动使用值1作为种子

编辑 由于评论


rand()
将返回一个介于0和
rand_MAX
(在标准库中定义)之间的数字。使用运算符(
%
)将给出除法的剩余部分
rand()/100
。这将强制随机数在0-99范围内。例如,要获得0-999范围内的随机数,我们将应用
rand()%1000

引用:

函数的作用是:设置参数 作为一个新序列的种子 要返回的伪随机整数 按rand()。这些序列是 通过使用 相同的种子值

如果未提供种子值,则 rand()函数是自动生成的 使用值1作为种子。

因此,在没有种子值的情况下,
rand()
假设种子为1(在您的情况下每次都是),并且具有相同的种子值,
rand()
将生成相同的数字序列。

在调用
rand()
之前调用
srand(sameSeed)
。更多详细信息。

此函数将seed建立为一系列新伪随机数的种子。如果在使用srand建立种子之前调用rand,它将使用值1作为默认种子

要在每次运行程序时生成不同的伪随机序列,请执行srand(time(0))

这是来自:

声明:

void srand(unsigned int seed); 

此函数为函数rand使用的随机数生成器设定种子。使用相同种子设定srand将导致rand返回相同的伪随机数序列。如果未调用srand,rand的作用与srand(1)相同已调用。

随机数生成器实际上不是随机的,它们与大多数软件一样是完全可预测的。兰德所做的是每次调用一个看似随机的伪随机数时创建一个不同的伪随机数。为了正确地使用它,您需要给它一个不同的起点

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

int main ()
{
  /* initialize random seed: */
  srand ( time(NULL) );

  printf("random number %d\n",rand());
  printf("random number %d\n",rand());
  printf("random number %d\n",rand());
  printf("random number %d\n",rand());

  return 0;
}
#包括
#包括
#包括
int main()
{
/*初始化随机种子:*/
srand(时间(空));
printf(“随机数%d\n”,rand());
printf(“随机数%d\n”,rand());
printf(“随机数%d\n”,rand());
printf(“随机数%d\n”,rand());
返回0;
}
rand()返回序列中的下一个(伪)随机数。发生的情况是每次运行时都有相同的序列(默认值为“1”)。若要为新序列设定种子,必须在开始调用rand()之前调用srand()

如果您每次都想要一些随机的东西,您可以尝试:

srand (time (0));
rand()返回数字。它根据给定的算法生成数字。 该算法的起点总是相同的,因此每次调用都会生成相同的序列。这在需要验证程序的行为和一致性时非常方便

您可以使用srand函数设置随机生成器的“种子”(在程序中仅调用srand一次)。从rand()生成器获取不同序列的一种常见方法是将种子设置为进程的当前时间或id:

srand(time(NULL));srand(getpid());在程序开始时


生成真正的随机性对于计算机来说是非常困难的,但是对于实际的非加密相关工作来说,一种试图均匀分布生成序列的算法工作得很好。

如果我还记得Knuth的开创性著作《计算机编程的艺术》中的一段话在随机数生成一章的开头,是这样的:

“从技术上讲,任何试图通过数学手段生成随机数的人都处于罪恶的状态”

简单地说,股票随机数生成器是算法,数学和100%可预测。在许多情况下,这实际上是一件好事,在这些情况下,一个可重复的“随机”数序列是可取的——例如,对于某些统计练习,你不希望出现“摆动”由于聚类效应,真正随机数据引入的结果

虽然从计算机硬件中获取“随机”数据位是第二种流行的选择,但它也不是真正的随机——尽管操作环境越复杂,随机性的可能性就越大——或者至少是不可预测性


真正的随机数据发生器倾向于寻找外部来源。放射性衰变是一种最受欢迎的现象,类星体的行为也是如此。任何源于量子效应的东西实际上都是随机的——这让爱因斯坦非常恼火。

这里有很多答案,但似乎没有人真正解释为什么是兰德()总是给同一个种子生成相同的序列,甚至是种子真正在做什么

rand()函数维护一个内部状态。从概念上讲,您可以将其视为一个称为rand_state的某种类型的全局变量。每次调用rand()时,它会执行两件事。它使用现有状态计算新状态,并使用新状态计算返回给您的数字:

state_t rand_state = INITIAL_STATE;

state_t calculate_next_state(state_t s);
int calculate_return_value(state_t s);

int rand(void)
{
    rand_state = calculate_next_state(rand_state);
    return calculate_return_value(rand_state);
}
现在您可以看到,每次调用rand(),它都会使rand_state沿着预先确定的路径移动一步。您看到的随机值只是基于您在该路径上的位置,因此它们也将遵循预先确定的顺序

下面是srand()的作用。它可以让您跳到路径上的不同点:

state_t generate_random_state(unsigned int seed);

void srand(unsigned int seed)
{
    rand_state = generate_random_state(seed);
}
确切的细节
state_t rand_state = INITIAL_STATE;

state_t calculate_next_state(state_t s);
int calculate_return_value(state_t s);

int rand(void)
{
    rand_state = calculate_next_state(rand_state);
    return calculate_return_value(rand_state);
}
state_t generate_random_state(unsigned int seed);

void srand(unsigned int seed)
{
    rand_state = generate_random_state(seed);
}
#include <stdio.h>
#include <stdlib.h>
#include <time.h>

int main() {
    srand(time(NULL));
    int i, j = 0;
    for(i = 0; i <= 10; i++) {
        j = rand();
        printf("j = %d\n", j);
    }
    return 0;
}