有人能向我解释一下种子值是什么吗?例如,我有这样的代码:
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的srandom
和random
。)
当程序正在调试或用作类分配时,通常使用固定值调用srand
,如srand(2020)
。这导致rand
每次生成相同的数字。这使得调试程序或检查学生程序的结果变得更容易。当设计可变的数字序列时,通常用srand(time(NULL))
来调用srand
。假设时间可用(time(NULL)
可能会返回−1表示错误),这会导致程序在不同的时间使用不同的序列。(通常,作为整数的time
的值每秒更改一次,但这可能因C实现而异。)
在C中,srand
取一个种子,该种子确定rand
将生成的数字序列(也称为伪随机数),只要程序不更改,并且程序使用rand
和srand
的相同实现即可。
在C语言中,srand
和rand
不能用于创建可复制的伪随机数序列,因为定义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;