N根据概率随机选择

时间:2013-08-25 01:35:52

标签: c random random-sample

此代码用于以一定概率获取随机数: 如果r介于0和0.8之间,则返回8;如果r介于0.8和1之间,则返回2。

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

int main()
{
    srand(time(NULL));
    double r = rand() / (double)RAND_MAX;
    double sum = 8 + 2;
    if (r < 8 / sum) {
        printf("80% \n");
    } else {
        printf("20% \n");
    }  
}

但如果我有两个以上的数字,比如n,我该如何处理呢?我可以使用多个if-else语句来处理它吗?还有什么?

2 个答案:

答案 0 :(得分:3)

<强>简单

  1. O(n)时间
  2. 中创建一个概率数组(总和为1.0)
  3. 生成介于0.0和1.0之间的随机数
  4. O(n)时间内遍历数组:
    • 如果随机数&lt;元素的概率,停止
    • 否则按概率递减随机数并移至下一个元素
  5. 答案是与您停在
  6. 的元素对应的数字

    <强>复合

    1. 创建累积概率数组并将其存储在数组中,O(n)时间(此数组应具有增加的值)
    2. 生成介于0.0和1.0之间的随机数
    3. 进行二元搜索,在>=时间内找到O(log(n))随机数的最小元素。
    4. 答案是与您停在
    5. 的元素对应的数字

      我没有提供必要的角落案件来解决。我相信你可以自己做。

答案 1 :(得分:1)

除了randomstring的提议之外,您还可以考虑构建一个Alias Table - O(n log n)来构造表,每个值生成一个O(1)。