如何在给定的时间间隔内以相等的概率生成随机数

时间:2014-01-14 17:26:41

标签: algorithm random

我尝试了很多但是无法解决这个问题

  

函数以相等的概率返回范围[1,6]中的数字。您可以使用库的rand()函数,并且可以假设rand()的实现以相同的概率返回范围[0,RAND_MAX]中的范围编号。

2 个答案:

答案 0 :(得分:3)

我们将分多步执行此操作。

您需要生成[1, 6]范围内的数字。

您有一个随机数生成器,可生成[0..RAND_MAX]范围内的数字。

假设您想要生成[0..5]范围内的数字。你可以这样做:

int r = rand();  // gives you a number from 0 to RAND_MAX
double d = r / RAND_MAX;  // gives you a number from 0 to 1
double val = d * 5; // gives you a number from 0 to 5
int result = round(d);  // rounds to an integer

您可以使用该技术,因此在给定[0, high]范围的情况下,您可以生成一个随机数,除以RAND_MAX,乘以high,然后对结果进行舍入。

您的范围是[1, 6],因此您必须添加另一个步骤。您希望生成[0, 5]范围内的随机数,然后添加1.或者,通常,要生成给定范围内的随机数[low, high],您可以写:

int r = rand();
double d = r / RAND_MAX;
int range = high - low + 1;
double val = d * range;
result = round(val);

显然你可以结合其中的一些操作。我只是单独展示它们来说明。

答案 1 :(得分:1)

基本上你正在寻找使用operator%(modolus)。

  

r = rand()%6 + 1

如果你担心RAND_MAX % 6 != 0并且解决方案会有偏见 - 你只需要“抛出”一些数字(最多5个)并重新绘制,如果你得到它们:

let M = (RAND_MAX / 6) * 6 [integer division]
r = dontCare
do { 
   r = rand()
} while (r > M)
r = r % 6 + 1 

PS,如果你想绘制一个'真实'数字,可以用:

完成
r = drawInt(1,5) // draw integer from 1 to 5 inclusive, as previously explained.
r += rand() / (RAND_MAX - 1) //the decimal part

请注意,它不是“真实”数字,两个数字之间的密度为1/RAND_MAX-1

相关问题