【问题标题】:Simple Rand() function简单的 Rand() 函数
【发布时间】:2012-10-18 05:04:39
【问题描述】:

使用以下原型编写一个函数。整数 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;
}

【问题讨论】:

    标签: c function loops random


    【解决方案1】:

    区间 [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).

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-11-08
      • 2023-03-23
      • 1970-01-01
      • 1970-01-01
      • 2014-11-05
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多