srand() 是如何工作的?
How does srand() work?
这是我的代码:
#include<stdio.h>
#include<stdlib.h>
#include <time.h>
int main(){
float m, n;
printf("Enter n, m:");
scanf("%f %f", &n, &m);
int l;
l=m-n;
int i;
for(i=0; i<4; i++){
srand(time(NULL));
double r=rand();
r/=RAND_MAX;
r*=l;
r+=n;
printf("%f ", r);
}
return 0;
}
为什么生成相同的数字?当我在循环之前写 srand(time(NULL));
时,它会生成不同的数字!为什么会这样?这个程序是如何工作的?
srand()
seeds 随机数序列。
The srand
function uses the argument as a seed for a new sequence of pseudo-random numbers to be returned by subsequent calls to rand
. If srand
is then called with the same seed value, the sequence of pseudo-random numbers shall be repeated. ... C11dr §7.22.2.2 2
和 time()
通常是相同的值 - 一秒钟
[编辑]
最好在代码
的早期只调用一次 srand()
int main(void) {
srand((unsigned) time(NULL));
...
或者,如果您每次都想要相同的序列,则根本不要调用 srand()
- 对调试很有用。
int main(void) {
// If code is not debugging, then seed the random number generator.
#ifdef NDEBUG
srand((unsigned) time(NULL));
#endif
...
调用 time(NULL)
returns 当前日历时间(自 1970 年 1 月 1 日以来的秒数)。
所以它是你给的同一种子。所以,rand 给出相同的值。
您可以简单地使用:
srand (time(NULL)+i);
这是我的代码:
#include<stdio.h>
#include<stdlib.h>
#include <time.h>
int main(){
float m, n;
printf("Enter n, m:");
scanf("%f %f", &n, &m);
int l;
l=m-n;
int i;
for(i=0; i<4; i++){
srand(time(NULL));
double r=rand();
r/=RAND_MAX;
r*=l;
r+=n;
printf("%f ", r);
}
return 0;
}
为什么生成相同的数字?当我在循环之前写 srand(time(NULL));
时,它会生成不同的数字!为什么会这样?这个程序是如何工作的?
srand()
seeds 随机数序列。
The
srand
function uses the argument as a seed for a new sequence of pseudo-random numbers to be returned by subsequent calls torand
. Ifsrand
is then called with the same seed value, the sequence of pseudo-random numbers shall be repeated. ... C11dr §7.22.2.2 2
和 time()
通常是相同的值 - 一秒钟
[编辑]
最好在代码
的早期只调用一次srand()
int main(void) {
srand((unsigned) time(NULL));
...
或者,如果您每次都想要相同的序列,则根本不要调用 srand()
- 对调试很有用。
int main(void) {
// If code is not debugging, then seed the random number generator.
#ifdef NDEBUG
srand((unsigned) time(NULL));
#endif
...
调用 time(NULL)
returns 当前日历时间(自 1970 年 1 月 1 日以来的秒数)。
所以它是你给的同一种子。所以,rand 给出相同的值。
您可以简单地使用:
srand (time(NULL)+i);