在C中生成随机,均匀分布的实数

时间:2016-01-31 17:39:24

标签: c random double random-sample uniform-distribution

我想在区间[0,1]中生成一个随机的实数。 我想为数字设置一个指针,比如说n,所以每当我说n时,它都会被称为随机生成的数字。

我在StackOverflow和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的值。

我如何修复我的程序?

2 个答案:

答案 0 :(得分:2)

您可以使用:

#include <time.h>
srand(time(NULL)); // randomize seed
double get_random() { return (double)rand() / (double)RAND_MAX; }
n = get_random();

srand()设置rand使用的种子生成伪随机数。如果您在第一次致电srand之前没有致电rand,就好像您已拨打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都会得到不同的数字。

答案 1 :(得分:0)

这显示了如何获得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