2012-10-28 47 views
1

使用以下原型编写函数。 int getRandomIntFrom0ToK(int K)该函数调用随机数 生成器,该生成器生成均匀分布在 区间[0,1]中的随机值,并且对于正整数K,返回一个随机数 ,均匀分布在整数{0,1 ,2,...,K}。写一个程序到 测试函数,它显示你的函数用{0,1,2,... K}中的每个数字产生的 产生的随机整数大概等于 概率。简单Rand()函数

那么,为什么有两个间隔?

{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,1]通常,如果它返回一个“真实”号码随机数生成器可能会返回什么(即浮动,而不是一个int)。这不是你想要的,这是你作为一个随机数发生器给出。你的任务是将结果转换成你想要的结果,它是一个介于0到K之间的整数。

碰巧,C rand()函数返回一个int而不是float,所以你可能想要除以如果您正在测试代码,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)。