Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/129.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 随机数的变化概率_C++_Random - Fatal编程技术网

C++ 随机数的变化概率

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

我想生成一个介于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,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想要的是未充分产生的零。这不是一个观察,这是一个要求。啊,我的错,不知怎的,我错过了那句话中的
我想
,这是我在需要处理概率时实际使用的方法。