为了进行比较,标准随机函数采用数字,例如3,这意味着012各自有33%的机会返回。

我需要实现以0.5为例的随机函数,这意味着0有50%的机会返回,1是25%,2是12.5%,依此类推直到无限。

我不能使用循环例如:

int SequencialRandom(double x)
{
    int result=0;
    while (DoubleRandom()>x) //DoubleRandom() returns randomized double that ranges from 0.0 to 1.0.
        result++;
    return result;
}

因为当我将0.01放入参数中时,平均它将循环100次,并且性能很差。有解决这个问题的好算法吗?

最佳答案

您正在寻找的是std::geometric_distribution提供的几何分布:

示例代码:

#include <iostream>
#include <iomanip>
#include <string>
#include <map>
#include <random>
int main()
{
    std::random_device rd;
    std::seed_seq seed{r(), r(), r(), r(), r(), r(), r(), r()};
    std::mt19937 gen(seed);

    // same as std::negative_binomial_distribution<> d(1, 0.5);
    std::geometric_distribution<> d;

    std::map<int, int> hist;
    for(int n=0; n<10000; ++n) {
        ++hist[d(gen)];
    }
    for(auto p : hist) {
        std::cout << p.first <<
                ' ' << std::string(p.second/100, '*') << '\n';
    }
}
分配输出:
0 **************************************************
1 ************************
2 ************
3 ******
4 **
5 *
6
7
8
9
10
13

关于c++ - 如何在每个后续值都比前一个值低的情况下实现随机函数?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/25596511/

10-11 11:33