在C的srand
函数中我没有得到种子的目的。有人可以向我解释吗?我知道srand
用于每次运行程序时生成随机数(与rand()
每次生成相同的随机数不同)。
答案 0 :(得分:1)
srand
的目的和传递给它的种子是让您控制对rand
生成的序列。
srand
初始化rand
使用的数据,因此它确定rand
生成的数字序列是什么。您可以使用它来选择是生成新序列(以前没有生成的序列)还是重复旧序列(以前生成的序列)。
例如,假设您具有某种模拟,并且需要随机数来选择此模拟的一些输入,例如客户何时到达或什么粒子进入系统。为此,您可以简单地反复使用rand
来生成数字。模拟完成后,您可能希望再次运行它,以查看由于有效地随机改变输入而导致模拟如何变化。但是,如果再次运行仿真程序,它将以完全相同的方式运行,因为如果未调用srand
,rand
始终会产生完全相同的序列。
因此,为了每次生成不同的序列,程序可以调用srand
并将其传递给另一个种子。标准time
例程返回的当前时间通常用作种子。但是,在程序的不同运行中选择不同值的任何方法都可以达到此目的。 (请注意,time(NULL)
通常返回秒数,因此,如果两次执行都在同一时间开始,那么快速连续执行两次使用srand(time(NULL))
的程序将导致使用相同的数字序列第二。)
为种子传递哪个值并不重要,只是它与其他实例不同。没关系的原因是,好的随机数生成器使用复杂且设计良好的函数将种子转换为随机数生成器的状态并计算生成的数字,这种设计使选择种子变得困难对生成的数字有任何故意的影响。
另一方面,有时您想重复一个序列。一次模拟运行可能会做一些有趣的事情,而您想更详细地研究它。或者您想将程序与重现结果所需的所有数据一起提供给同事。或者程序中的错误只会在某些时候出现,因此您需要在调试时准确重复执行。在这种情况下,您将在每次执行中将相同的种子传递给srand
,以便再现相同的生成数字序列。
在我使用变化的种子的程序中(例如time(NULL)
),我让程序编写了要用于输出的种子,因此,如果用户以后希望以相同的顺序运行,他们可以通过指定使用该种子的命令行开关(也内置在程序中)将该种子传递给程序。
答案 1 :(得分:0)
通常会构造一个随机数生成器,以便从前一个生成一个新的随机数。它是前一个数字的函数。这意味着当随机生成器第二次生成数字时,您将再次获得完全相同的序列。
常见的做法是:
X_n+1 = (a*X_n + b) % m
X_n+1
是下一个随机数。 X_n
是前一个,a
,b
和m
是合适的常数。
最终,您将击中之前使用过的号码。因此,您可以查看它,因为您有一长串圆形数字。 srand
确定在此循环中的何处开始。为了确保始终获得不同的数字,您经常使用当前时间和日期作为种子。
请注意,对于更复杂的随机生成器,上面的描述不一定是100%正确,但是原理是相同的。
srand
还有另一个很好的用途。如果使用相同的种子,则会得到相同的随机序列,这在调试或代码时会非常好。某些错误可能只针对某些随机数才会表现出来。
答案 2 :(得分:0)
rand()
函数返回某个函数(随机数生成器)定义的数字序列中的下一个数字,而srand()
函数定义序列中的第一个数字。
如果您将值传递给srand
,请(例如)调用rand
5次,然后再次使用相同的值调用srand
,并再调用rand
5次,则第一组5个数字将与下一组5个数字完全相同。
如果您不调用srand
,其效果与调用srand(0)
相同,因此这就是为什么在程序中调用rand
而不调用srand
会导致相同的数字序列。如果您改为将某个变化的值传递给srand
,例如进程ID,当前时间或它们的某种数学组合,则您将为随机数序列获得一个相当独特的起点,从而获得一个相当独特的顺序。
答案 3 :(得分:0)
在宇宙中是否存在真正的随机性是一个悬而未决的问题,很可能答案是否定的。在信息学中,仅使用伪随机性(RNG中的确定性算法),即通过确定性非线性动力系统/确定性混沌系统的级联生成(模也是非线性的)。 seed
可以认为是确定性混沌系统的初始值(RNG),然后通过对初始条件的敏感度'增长'(又名< em>蝴蝶效应)
如何获取种子是另一个问题,因为它需要外部测量,然后从代码的角度将其视为随机 ,从物理学的角度来看,如果时间流或处理器温度是随机的,则是另一个问题:
标准做法是使用对
srand(time(0))
的调用结果作为种子。
源:https://www.geeksforgeeks.org/rand-and-srand-in-ccpp/
除了时间以外,其他可能的外部“随机性”来源是温度,即处理器的温度,...