在 C 中生成随机均匀分布的实数
Generating a random, uniformly distributed real number in C
我想生成一个区间为[0,1]的随机实数。
我想为数字设置一个指针,比如 n
,所以每当我声明 n
时,它都会引用随机生成的数字。
我在 Whosebug 和 Google 上进行了搜索,但其中大部分都是针对 C++ 或整数的。
我已经尝试过答案中向我建议的代码:
#include <stdio.h>
#include <stdlib.h>
int main()
{
double n;
double get_random() { return (double)rand() / (double)RAND_MAX; }
n = get_random();
printf("%f", n);
return 0;
}
但是,我只能得到一个值 0.00000000。
我该如何修复我的程序?
您可以使用:
#include <time.h>
srand(time(NULL)); // randomize seed
double get_random() { return (double)rand() / (double)RAND_MAX; }
n = get_random();
srand()
设置 rand
用来生成伪随机数的种子。如果您在第一次调用 rand
之前没有调用 srand
,就好像您调用了 srand(1)
(作为默认值)。
如果要排除 [1],请使用:
(double)rand() / (double)((unsigned)RAND_MAX + 1);
完整解决方案:
#include <stdio.h>
#include <time.h>
#include <stdlib.h>
double get_random() { return ((double)rand() / (double)RAND_MAX); }
int main()
{
double n = 0;
srand(time(NULL)); // randomize seed
n = get_random(); // call the function to get a different value of n every time
printf("%f\n", n); // print your number
return 0;
}
每次 运行 你都会得到一个不同的数字 n
。
这显示了如何获得 0..1 范围内的随机实数,但请注意它们不是均匀分布的。只有 (RAND_MAX+1)
个离散值。
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
int main(void) {
int i;
double n;
srand((unsigned)time(NULL)); // seed the random num generator ONCE only
for(i = 0; i < 3; i++) { // get 3 random numbers
n = (double)rand() / RAND_MAX; // in the range 0 ... 1
printf("%f\n", n); // use correct format specifier for the var
}
return 0;
}
我的程序输出:
0.622608
0.814081
0.878689
我想生成一个区间为[0,1]的随机实数。
我想为数字设置一个指针,比如 n
,所以每当我声明 n
时,它都会引用随机生成的数字。
我在 Whosebug 和 Google 上进行了搜索,但其中大部分都是针对 C++ 或整数的。
我已经尝试过答案中向我建议的代码:
#include <stdio.h>
#include <stdlib.h>
int main()
{
double n;
double get_random() { return (double)rand() / (double)RAND_MAX; }
n = get_random();
printf("%f", n);
return 0;
}
但是,我只能得到一个值 0.00000000。
我该如何修复我的程序?
您可以使用:
#include <time.h>
srand(time(NULL)); // randomize seed
double get_random() { return (double)rand() / (double)RAND_MAX; }
n = get_random();
srand()
设置 rand
用来生成伪随机数的种子。如果您在第一次调用 rand
之前没有调用 srand
,就好像您调用了 srand(1)
(作为默认值)。
如果要排除 [1],请使用:
(double)rand() / (double)((unsigned)RAND_MAX + 1);
完整解决方案:
#include <stdio.h>
#include <time.h>
#include <stdlib.h>
double get_random() { return ((double)rand() / (double)RAND_MAX); }
int main()
{
double n = 0;
srand(time(NULL)); // randomize seed
n = get_random(); // call the function to get a different value of n every time
printf("%f\n", n); // print your number
return 0;
}
每次 运行 你都会得到一个不同的数字 n
。
这显示了如何获得 0..1 范围内的随机实数,但请注意它们不是均匀分布的。只有 (RAND_MAX+1)
个离散值。
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
int main(void) {
int i;
double n;
srand((unsigned)time(NULL)); // seed the random num generator ONCE only
for(i = 0; i < 3; i++) { // get 3 random numbers
n = (double)rand() / RAND_MAX; // in the range 0 ... 1
printf("%f\n", n); // use correct format specifier for the var
}
return 0;
}
我的程序输出:
0.622608
0.814081
0.878689