据我所知,如果不更改种子数,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);
}
Run Code Online (Sandbox Code Playgroud)
我看不到srand的链接
((unsigned) time(&t));
Run Code Online (Sandbox Code Playgroud)
和兰特.
printf("%d\n", rand() % 50);
Run Code Online (Sandbox Code Playgroud)
兰德和斯特兰德之间的联系在哪里?我的意思或期望是我假设rand()将从srand()获取一些参数,因此它知道每次生成不同的数字.我假设它看起来像rand(srand(time(null));
这就像在不使用它的情况下初始化变量一样.srand正在初始化,但我没有看到它被使用.
rand会生成不同的数字,因为在rand之前首先调用srand吗?
pax*_*blo 15
srand()设置用于rand生成"随机"数字的种子(在引号中,因为它们通常是伪随机的).如果您srand在第一次打电话之前没有打电话rand,就好像您曾打电话srand(1)将种子设置为一个.
许多代码使用当前时间作为种子,以便使每个程序运行使用不同的随机数序列,但srand(42)为了可重复性,您可以随时将其更改为类似于调试期间的内容.而调用time()实际上并不需要一个变量来放置时间,你可以只传递NULL:
srand (time (NULL));
Run Code Online (Sandbox Code Playgroud)
整个事情可以在单个文件中实现,类似于以下内容,标准(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;
}
Run Code Online (Sandbox Code Playgroud)
事实next是文件顶部的静态变量意味着它对文件外部的所有内容都是不可见的,但对于内部的所有内容都是可见的(类似于本地化的全局).这是srand()和之间的沟通方式rand().
您看不到链接,因为(幸运的是!)设计者rand()决定保留该实现的详细信息,就像您看不到FILEstdio的内容一样。缺点是他们决定使该状态成为全局(但隐藏)变量,而不是生成器的参数。
与已弃用的相比rand_r():状态是一个无符号整数(假定> = 32位),这意味着即使禁止使用任何大于该状态的更好的生成器,也仅仅是因为没有空间存储它!
通过保持内部状态为隐藏状态,只要您保证无需初始化就调用rand与调用srand相同,就可以随意选择最有效的算法(速度,周期,...)并在后台使用它。种子== 1。
Paxdiablo向您展示了C标准的示例;参见例如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);
Run Code Online (Sandbox Code Playgroud)
除了只有一个state变量外,rand函数完全像这样。