我尝试了很多但是无法解决这个问题
函数以相等的概率返回范围
[1,6]
中的数字。您可以使用库的rand()
函数,并且可以假设rand()
的实现以相同的概率返回范围[0,RAND_MAX]
中的范围编号。
答案 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