【问题标题】:Generating a random, uniformly distributed real number in C [duplicate]在C中生成一个随机的、均匀分布的实数[重复]
【发布时间】:2016-05-09 02:32:59
【问题描述】:

我想在区间 [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。

如何修复我的程序?

【问题讨论】:

  • 当您尝试使用%fprintfunsigned int 时,您的编译器会报错吗?也许您打算将 r 声明为 double
  • 您的while 循环无效,因为y = RAND_MAX + 1 来自rand 的返回值将始终为&lt; y
  • 您能否详细说明“我想为数字设置一个指针,比如 n,所以每当我说 n 时,它将被称为随机生成的数字”是什么意思?这怎么不只是简单的指针赋值?
  • 您可以将无符号rand 值缩放为您范围内的实数,但这些值不会按照您的要求均匀分布。粒度还是一样的:只会生成RAND_MAX不同的值。
  • 抱歉不清楚...我是C编程的初学者,所以我只是去google并找到了rand()命令...

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


【解决方案1】:

你可以使用:

#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号码。

【讨论】:

  • 感谢 Idos。我不知道是谁投了反对票……我仍然没有能力投票,因为我还没有 15 名声望……然后我确实尝试打印了 n,但是,我尝试了数十次时间,答案总是 0.001215 是不是因为 n 被定义后失去了随机性?
  • 我将编辑我的答案,以便您每次都能获得一个新的 n 值。现在试试吧,每次调用 get_random() 都会得到一个不同的新号码
  • Idos,它仍然给出 0.001215 的结果...我应该添加一个 ;在 {} 之后定义 get_random() 以使其正常运行?
  • 我明白了...谢谢 Idos,这对我有很大帮助...我将尝试更多地了解 C 和主循环外函数的用法...非常感谢!
  • @Idos : C 是一种过程语言functional language 在计算机科学中有特定的含义,C 不是。
【解决方案2】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-08-14
    • 1970-01-01
    • 1970-01-01
    • 2014-08-16
    • 2013-12-09
    • 2015-06-24
    相关资源
    最近更新 更多