c-根据种子值生成随机数



有人能向我解释一下种子值是什么吗?例如,我有这样的代码:

int MIN=0;
int MAX=100;
srand((unsigned) time(NULL));
srand(2020);
int num = (int)(rand() / (RAND_MAX + 1.0 + MIN) * MAX);

我需要使用种子值2020来生成0到100之间的数字。我检查了所有地方,但似乎没有教程解释什么是种子值,以及代码应该如何从默认种子值更改。我的代码的第3行采用默认的种子值,因此它不适用于2020的种子值。此外,MAX为100,MIN为0。

提前感谢!

伪随机数生成器使用作为种子传递的参数进行初始化。对于srand调用中使用的每个不同种子值,可以预期伪随机数生成器在随后的rand调用中生成不同的连续结果。

http://www.cplusplus.com/reference/cstdlib/srand/

然后调用rand()将返回一个从0到rand_MAX范围内的伪随机数。

如果您希望rand()产生不同的随机数,请确保每次呼叫rand()时不会呼叫srand(2020)。因为您只需要为随机数生成种子一次。

种子有两种用途。最常见的方法是用不同的值启动随机生成器。当你想为加密算法生成一个随机值时,这很重要。启动程序时,不希望每次运行都使用相同的值。。。

另一种用途是生成可重复的伪随机序列。当你想要可重复的测试,或者当你想用随机数据与其他人交换,但希望所有人都使用相同的序列时,这很重要。教程中经常使用它来获得一致的序列,用户在遵循教程时可以重现该序列。教师也使用它,因为它更容易看到学生是否找到了正确的结果(如果每个学生使用不同的序列,所有结果都会不同)

rand函数生成一些数字序列。(该序列是经过计算的,但其作用是将数字视为随机的,因此它们被称为伪随机。)就其本身而言,它将始终在程序中生成相同的数字序列。我们使用srand来选择它生成的数字序列。(最常见的是,如果调用次数足够多,rand会生成一个相同数字的循环,而srand只会选择该循环中的起始位置。)

因此,您可以调用srand来设置rand序列的起点。传递给srand的值是任何unsigned int值。在C标准中,该值没有指定的含义。你只需要给srand一个数字,比如1来获得一个序列,2来获得不同的序列,3来获得另一个序列等等。你对生成的实际值没有其他控制;将种子设置为某个特定值并不保证第一个CCD_ 13调用将返回任何特定的记录值。

C标准也没有规定任何计算序列中数字的方法。每个C实现都可以选择自己的方法。一些C实现使用了糟糕的方法,其中的数字根本不是非常随机的,并且一些模式很容易被观察到。(因此,通常建议使用替代方案,如Unix的srandomrandom。)

当程序正在调试或用作类分配时,通常使用固定值调用srand,如srand(2020)。这导致rand每次生成相同的数字。这使得调试程序或检查学生程序的结果变得更容易。当设计可变的数字序列时,通常用srand(time(NULL))来调用srand。假设时间可用(time(NULL)可能会返回−1表示错误),这会导致程序在不同的时间使用不同的序列。(通常,作为整数的time的值每秒更改一次,但这可能因C实现而异。)

在C中,srand取一个种子,该种子确定rand将生成的数字序列(也称为伪随机数),只要程序不更改,并且程序使用randsrand的相同实现即可。

在C语言中,srandrand不能用于创建可复制的伪随机数序列,因为定义C语言的标准没有指定该序列是什么,即使给出了种子。值得注意的是,rand使用了一个未指定的伪随机数算法,该算法在C实现之间可能有所不同,包括同一标准库的版本。这不是";编译器";,";系统";,或";架构";其决定使用CCD_ 30和CCD_。另请参阅以下问题:

  • rand()的结果在各个系统之间的可预测性如何
  • Python有一个模仿C';s rand()
  • 为什么rand()的使用被认为是不好的

要生成具有特定种子的随机数,请使用srand将种子设置为一次性
然后使用rand生成随机数。默认范围在0和RAND_MAX之间(RAND_MAX=32767)
要定义最大数量,只需通过预编译器语句覆盖RAND_MAX(包括副作用)或使用Modulo%

覆盖RAND_MAX

#ifdef RAND_MAX
#undef RAND_MAX
#define RAND_MAX 100
#endif

使用Modulo

srand(2020);
int random_number = rand() % 100;

最新更新