1

使用以下原型编写一个函数。int getRandomIntFrom0ToK(int K) 函数调用随机数生成器,该生成器生成一个均匀分布在区间 [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;
}
4

1 回答 1

0

区间 [0,1] 通常是随机数生成器在返回“实”数(即浮点数,而不是整数)时可能返回的值。这不是你想要的,这是你作为随机数生成器得到的。您的任务是将结果转换为您想要的,即 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)。

于 2012-10-28T19:50:15.157 回答