使用以下原型编写函数。 INT getRandomIntFrom0ToK(int K)该函数调用随机数 生成均匀分布的随机值的生成器 interval [0,1]并返回正整数K的随机数 均匀分布在整数{0,1,2,... K}上。写一个程序 测试函数,它显示生成的随机整数 你的函数命中{0,1,2,... K}中的每个数字大致相等 概率。
那么,为什么有两个间隔?
{0,K}是可以理解的,但为什么[0,1]是必要的?
我不知道到目前为止我在做什么:
#include <stdio.h>
int getRandomIntFrom0toK(int K)
{
int i=0;
printf("enter k:");
scanf("%d",&K);
while (i<K)
{
int num=(rand()%(K-1)+1);
printf("%d\n",num);
i++;
}
}
int main(void)
{
int result=getRandomIntFrom0toK(1+rand()%(1));
return 0;
}
答案 0 :(得分:0)
间隔[0,1]通常是随机数生成器在返回“实数”(即浮点数而不是int)时可能返回的值。这不是你想要的,而是给出作为随机数生成器。您的任务是将结果转换为您想要的结果,即0到K之间的整数。
碰巧,C rand()函数返回一个int而不是一个浮点数,所以你可能想要除以RAND_MAX以获得相同的效果,如果你正在测试你的代码。
通过将结果乘以K将其转换为[0,K]范围,然后添加偏移量L以将其转换为范围,将此生成器的结果转换为所需的任何间隔都很容易[L,L + K]。因此,例如,如果你想要一个介于-2和+2之间的数字,你可以这样做:
float x = rand() / (float) RAND_MAX; /* x is between 0 and 1 */
x = x * 4; /* x is now between 0 and 4 */
x = x - 2; /* x is now between -2 and 2 */
在你的情况下,你想要一个介于0和K之间的整数,而不是浮点数。所以一旦你完成了转换,就可以舍入到最接近的整数。但是你需要小心正确地选择你的范围,这样0和K就像任何一个中间整数一样,所以你不会得到一个超出范围的值(例如-1或K +) 1)。