C++ 随机数的变化概率
我想生成一个介于0和3之间的随机数,我的代码中有以下内容:C++ 随机数的变化概率,c++,random,C++,Random,我想生成一个介于0和3之间的随机数,我的代码中有以下内容: int random = rand() % 4; 这很好,但我希望它在大多数情况下生成1、2和3,并且仅偶尔生成0 最好的办法是什么?解决此问题的常用算法的名称是什么?您测试了多少个数字?如果这是真的,你可以使用a=rand()%4000生成一个范围,比如0->3999,然后使用int=a/1000这应该可以去除明显不足的零的权重。我只需要将更多的值从一个更大的集合映射到1,2,3。例如:9和映射1,2,3=>1,3,4,5=>2,6
int random = rand() % 4;
这很好,但我希望它在大多数情况下生成1、2和3,并且仅偶尔生成0
最好的办法是什么?解决此问题的常用算法的名称是什么?您测试了多少个数字?如果这是真的,你可以使用
a=rand()%4000
生成一个范围,比如0->3999,然后使用int=a/1000
这应该可以去除明显不足的零的权重。我只需要将更多的值从一个更大的集合映射到1,2,3。例如:9和映射1,2,3=>1,3,4,5=>2,6,7,8=>3和0表示零。还有其他方法,但我在你的问题范围内工作这里有一种方法。假设您希望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;
double val=(double)rand()/rand_MAX;
int随机;
如果(val<0.05)//5%
随机=0;
如果(val<0.25)//5%+20%
随机=1;
如果(val<0.55)//5%+20%+30%
随机=2;
其他的
随机=3;
当然,这不一定要用浮点完成。我就是这样做的,因为它更直观。只需编写您想要的代码:
int myrand(void)
{
const int percentZero = 10;
if ((rand()%100) < percentZero) return 0;
return 1 + (rand() % 3);
}
int myrand(无效)
{
常数int百分之零点=10;
如果((rand()%100)
您可以更改时间0返回到您想要的任何值的百分比。您没有给出确切的比例,但是假设您希望1、2和3在32%的时间内出现,0在其他4%的时间内出现。然后你可以写:
int random = rand() % 25;
if(random > 0)
random = random % 3 + 1;
(很明显,你需要根据不同的比例来调整。以上只是一种方法;许多类似的方法都可能奏效。)你需要找到一个适用于你的案例的概率分布。由于您只讨论数字0-3,因此这非常简单,如果第一个结果为0,您可以再次调用
rand()
,也可以使用权重:
int random = rand() % 16;
if(random > 10)
{
random = 3;
}
else if(random > 5)
{
random = 2;
}
else if(random > 0)
{
random = 1;
}
这不是一个特别优雅的版本,但希望它能向您展示如何创建自定义发行版以满足您的需要。您可以使用随机库中的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);
}
#包括
#包括
#包括
int main()
{
离散分布区({1.0,4.0,4.0,4.0});
标准:mt19937英语(标准:时间(0));
对于(int i=0;它不是一个随机数。这是一个概率分布,与随机数相反(当你谈论RNG时,可预测性是可怕的)。我认为你误解了这个问题,因为你问的是一个与它完全相反的问题。OP是说rand()%4
均匀分布数字,但是(s) 他希望零的出现频率降低。我认为OP想要的是未充分产生的零。这不是一个观察,这是一个要求。啊,我的错,不知怎的,我错过了那句话中的我想,这是我在需要处理概率时实际使用的方法。