srand与rand函数有什么关系?

据我所知,如果不更改种子数,rand()函数会生成每个运行它的相同数字。 这就是srand()的用武之地。时间总是在变化所以我知道你应该将time(null)参数传递给srand。 我的问题是从教程网站下面的代码。

int main() { int i, n=5; time_t t; /* Intializes random number generator */ srand((unsigned) time(&t)); /* Print 5 random numbers from 0 to 50 */ for( i = 0 ; i < n ; i++ ) { printf("%d\n", rand() % 50); } return(0); } 

我看不到srand的链接

 ((unsigned) time(&t)); 

和兰特。

 printf("%d\n", rand() % 50); 

兰德和斯特兰德之间的联系在哪里? 我的意思或期望是我假设rand()将从srand()获取一些参数,因此它知道每次生成不同的数字。 我假设它看起来像rand(srand(time(null));

这就像在不使用它的情况下初始化变量一样。 srand正在初始化,但我没有看到它被使用。

rand会产生不同的数字,因为在rand之前首先调用srand吗?

随机数种子是全局静态变量。 randsrand都可以访问它。

srand()设置rand用来生成“随机”数字的种子(在引号中,因为它们通常是伪随机的)。 如果你在第一次调用rand之前没有调用srand ,就好像你已经调用了srand(1)来将种子设置为1。

许多代码使用当前时间作为种子,以便使每个程序运行使用不同的随机数序列,但为了可重复性,您可以在调试期间将其更改为类似srand(42)的内容。 而对time()的调用实际上并不需要一个变量来放置时间,你可以只传递NULL:

 srand (time (NULL)); 

整个过程可以在单个文件中实现,如下所示,标准中给出的示例( ISO C99 7.20.2.2 The srand function )。

 // RAND_MAX assumed to be 32767. static unsigned long int next = 1; void srand(unsigned int seed) { next = seed; } int rand(void) { next = next * 1103515245 + 12345; return (unsigned int)(next/65536) % 32768; } 

next是文件顶部的静态变量这一事实意味着它对文件外部的所有内容都是不可见的,但对于内部的所有内容都是可见的(类似于本地化的全局)。 这是srand()rand()之间的通信方法。

你没有看到链接,因为(幸运的是!)设计rand()决定保留一个实现细节,就像你没有看到stdio中的FILE内部一样; 缺点是他们决定将该状态设为全局(但隐藏)变量,而不是生成器的参数。

与已弃用的rand_r()对比:状态是无符号整数(假设> = 32位),这意味着即使禁止使用状态大于此的任何更好的生成器,也只是因为没有空间来存储它!

通过保持内部状态隐藏,相反,可以自由选择最适合的任何算法(速度,周期,…)并在幕后使用它,只要您保证在没有初始化的情况下调用rand与调用srand相同种子== 1。

Paxdiablo向您展示了C标准的例子; 请参阅http://en.wikipedia.org/wiki/Multiply-with-carry ,以获取使用不同生成器的示例,您可以隐藏在rand / srand后面。

只是为了得到额外的清晰:如果rand_r设计得恰当,会有一个不透明的类型,比如说rand_t (可能是一个整数,一个结构,一个数组……),你可以传递给rand_r和一些hypotetical srand_r ,如

 rand_t state; srand_r(&state, 1); n = rand_r(&state); 

除了只有一个state变量之外,rand函数与此完全相同。

兰德给你一个伪随机数字序列。

该数字由算法生成,该算法在每次调用时返回一系列明显不相关的数字。 该算法使用种子生成序列,应使用函数srand将其初始化为某个独特的值。

每次调用时的srand都会将指针指向列表中的某个位置。如果您没有在每次尝试时调用它或给它一个修复种子,它将为您提供相同的序列。 很多人建议将当前的第二个作为种子。 但是如果你尝试在同一秒内运行你的代码两次,它会给你相同的序列。

对于在调用srand中使用的每个不同的种子值,可以预期伪随机数生成器在随后的rand调用中生成不同的连续结果以进一步解释