我想生成0到3之间的随机数,我的代码中有以下内容:
int random = rand() % 4;
Run Code Online (Sandbox Code Playgroud)
这工作正常,但我希望它在大多数时间生成1,2和3,偶尔生成0.
最好的方法是什么?解决此问题的常用算法有哪些名称?
Mys*_*ial 16
这是一种方式.假设您希望0,1,2,3的分布分别为5%,20%,30%,45%.
你可以这样做:
double val = (double)rand() / RAND_MAX;
int random;
if (val < 0.05) // 5%
random = 0;
else if (val < 0.25) // 5% + 20%
random = 1;
else if (val < 0.55) // 5% + 20% + 30%
random = 2;
else
random = 3;
Run Code Online (Sandbox Code Playgroud)
当然,不必使用浮点数.我这样做是因为它更直观.
您可以使用随机库中的discrete_distribution类.
#include <iostream>
#include <random>
#include <ctime>
int main()
{
std::discrete_distribution<> dist({ 1.0, 4.0, 4.0, 4.0 });
std::mt19937 eng(std::time(0));
for (int i=0; i<100; ++i)
std::cout << dist(eng);
}
Run Code Online (Sandbox Code Playgroud)
如果你不能使用C++ 11,这些类也存在于boost中.
| 归档时间: |
|
| 查看次数: |
14929 次 |
| 最近记录: |