【问题标题】:Generate random number in C with probability在 C 中以概率生成随机数
【发布时间】:2018-04-14 09:13:32
【问题描述】:

据我所知,C 中的 rand() 函数是一个均匀随机分布。

那么,我怎样才能生成一个有概率的范围随机数呢?

示例

生成 200 个随机数,范围从 -100100 小于 20% 总数为负数?

【问题讨论】:

  • 画出从-100到+403的数字。如果数字是正数,除以 4
  • 在区间 [1-100] 中获取 x 作为随机数,如果 x20 获取一些正随机数?
  • @AnttiHaapala 这不能生成随机数 -100 到 -25
  • @Jean-BaptisteYunès 负数的总数总是等于 20%,因为 rand() 是均匀分布随机的。
  • 不,不总是,平均为 20%,可能更少或更多。随机是随机的......均匀意味着每个值的概率是相同的,仅此而已。我的意思是你有 20% 的机会得到一个负值,但这并不意味着你会有一个!有 1/1.000.000 的彩票机会并下注 1.000.000 次并不意味着您会赢。

标签: c random range


【解决方案1】:

RAND_MAX 可以帮忙:

#include <stdio.h>
#include <stdlib.h>
#include <time.h>

static int rand_prob(void)
{
    int r = rand();

    if (r < RAND_MAX / 8) {
        return -(r % 101);
    } else {
        return +(r % 101);
    }
}

int main(void)
{
    int i;

    srand((unsigned)time(NULL));
    for (i = 0; i < 200; i++) {
        printf("%d\n", rand_prob());
    }
    return 0;
}

您可以调整函数以使其可重用:

static int rand_prob(int percent, int min, int max)
{
    int r = rand();

    if (r < (RAND_MAX / percent / 10)) {
        return -(r % (max - min + 1) + min);
    } else {
        return +(r % (max - min + 1) + min);
    }
}

main:

printf("%d\n", rand_prob(80, 0, 100));

【讨论】:

  • 你能解释一下RANDOM_MAX/8部分吗?谢谢
  • 是的,RAND_MAXrand() 可以返回的最大数字,如果您得到的数字小于这个 max_number/8 则您的概率为 20%。
【解决方案2】:

如果你想在你的数字之间精确地划分 80-20,那么你可以简单地从 0 - 100 范围内选择 160 数字和从范围内选择 40 数字-100 - 0.

(200 的 80% = 160)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-10-01
    • 2016-01-26
    • 2013-12-06
    • 2016-01-06
    • 2017-03-24
    • 2014-10-06
    • 2015-07-05
    • 1970-01-01
    相关资源
    最近更新 更多