繁体   English   中英

简单的Rand()函数

[英]Simple Rand() function

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM