我知道,如果您不更改种子号,rand()函数每运行都会生成相同的数字。这就是srand()的来源。时间总是在变化,所以我知道您应该将时间(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("%dn", rand() % 50);
}
return(0);
}
我看到Srand的链接
((unsigned) time(&t));
和兰德。
printf("%dn", rand() % 50);
Rand和Srand之间的连接在哪里?我的意思或期望的是,我假设rand()将从srand()获得一些参数,因此它知道每次都会生成不同的数字。我认为它看起来像rand(srand(time(null));
这就像初始化变量而不将变量使用给我。Srand正在初始化,但我认为它没有使用。
rand会产生不同的数字,因为srand在兰德之前首先被称为?
随机数种子是一个全局静态变量。rand
和srand
都可以访问它。
srand()
设置了rand
使用的种子来生成"随机"数字(以引号为单位,因为它们通常是伪随机的)。如果您在第一次致电rand
之前不致电srand
,那就好像您打电话给srand(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位),这意味着即使是 forbidden 使用任何状态更大的更好的发生器,仅仅是因为没有存储空间!
通过将内部状态隐藏,相反,只要您保证无初始化的rand nond and nondy nondy nonge and the幕后,就可以自由选择任何算法(速度,期限,...)并在幕后使用它。用种子==1。
调用srandpaxdiablo向您展示了C标准的示例;请参阅eg http://en.wikipedia.org/wiki/multiply-with-carry,以示例使用其他发电机,您可以隐藏在rand/srand后面。
只是要明确:如果正确设计了rand_r
,则会有不透明的类型,例如rand_t
(可能是整数,结构,一个数组,...),您将传递给rand_r
以及某些偏瘫的srand_r
,如
rand_t state;
srand_r(&state, 1);
n = rand_r(&state);
rand函数与此完全一样,只是只有一个state
变量。
rand 为您提供数字的伪随机序列。
此数字是由每次调用时返回一系列无关数字的序列而生成的。该算法使用种子生成该系列,该系列应使用函数SRAND初始化为某些独特的值。
srand 在每个呼叫上将指针设置为列表中的某些位置。如果您在每次尝试上不调用它或给它一个修复种子,它将为您提供相同的序列。许多人建议将电流作为种子。但是,如果您尝试在同一第二秒内运行代码,它将给您相同的顺序。
对于呼叫SRAND中使用的每个不同种子价值,可以期望伪随机数生成器在随后呼叫的RAND中产生不同的结果,以进一步说明