4

做这个的最好方式是什么?我的编译器显示 RAND_MAX = 32,767。所以我很好奇如何获得 0 到 100,000 之间的统一随机生成值?

4

5 回答 5

10

我将把 juanchopanza 的评论作为答案。

<random>如果您的编译器提供标头 (C++11),请使用标头。

std::random_device rd;
std::mt19937 gen(rd());
std::uniform_int_distribution<> dis(0, 10000);

std::cout << dis(gen) << std::endl;
于 2013-11-03T22:12:19.970 回答
1

我很久以前在某个网站上发现了以下功能。作者声称函数提供了良好的一致性。

#define RS_SCALE (1.0 / (1.0 + RAND_MAX))
double drand(void) 
{
    double d;
    do {
       d = (((rand () * RS_SCALE) + rand ()) * RS_SCALE + rand ()) * RS_SCALE;
    } while (d >= 1); /* Round off */
    return(d);
}

正如下面的评论中所指出的,这给出了 0..1 范围内的答案,所以你必须乘以 100000,即drand()*100000.

于 2013-11-03T22:08:38.747 回答
1

那时您可能应该下载并使用一个严肃的 PRNG,例如Gnu Scientific Library中可用的那些。

于 2013-11-03T22:13:08.753 回答
-1

我的发现是首先#include <time.h>,然后你可以写srand(time(NULL));一个值到随机函数中。那么你所要做的就是使用这一行:(rand() % 99999 + 1);. 这应该会给你一个介于 0 到 100,000 之间的随机值。如果需要,您还可以将其分配给变量:int myVar = (rand() % 99999 + 1);. 希望有帮助!(而且我希望我是完全正确的。我还在获得 CS 学位并仍在学习 C++,但我之前已经这样做了,并且成功了。)

于 2017-09-18T23:04:37.740 回答
-3

这是您的代码:

100000.0f * ((float)rand() / 32767.0f)

这将产生从 0 到 100000 的随机浮点数,但您可以在此处使用 100000 以外的任何正数。

更新:

确实(感谢psj下面的评论)我已经意识到上面覆盖了 0..100000 范围的 ~1/3。

于 2013-11-03T22:12:33.800 回答