从基于礼仪的列表中返回随机对象

时间:2017-08-05 14:44:04

标签: c++ algorithm random

对我来说,这是一个非常奇怪的问题,因为我无法正确地查看我的问题。只是为了让你知道,我并不是真的要求代码而只是为了一个想法来编写一个适当的alogirthm ,这会根据它们发生的概率产生一些天气。

这就是我想要实现的目标:

假设我有一个 WeatherClass ,其参数名为" 概率"。我希望不同的天气实例有自己发生的概率"。

enum Probability {
Never = -1,
Low = 0,
Normal = 1,
Always = 2
};

std::vector<WeatherClass> WeatherContainer;

WeatherClass Sunny = WeatherClass();
Sunny.Probability = Probability.Normal;

WeatherClass Rainy = WeatherClass();
Rainy.Probability = Probability.Low;

WeatherClass Cloudy = WeatherClass();
Cloudy.Probability = Probability.Normal;

WeatherContainer.push_back(Sunny);
WeatherContainer.push_back(Rainy);
WeatherContainer.push_back(Cloudy);

现在,我的问题是:根据自己发生的概率,返回某些天气最聪明的方法是什么?

我不知道为什么,但我无法解决这个问题。我的第一个猜测就是拥有某种运气&#34;变量并将其与每个元素或类似事物的概率进行比较。

任何提示或建议都会非常有用。

映入眼帘,

需要

2 个答案:

答案 0 :(得分:-1)

一般来说,假设你有一个整数序列的数字代表概率的线性增长(从1开始,而不是0!):

select 
      JustDates.DateToInclude,
      coalesce( SumCnts.TotalEmails, 0 ) TotalEmails
   from
      ( select
              @myDate := DATE_ADD( @myDate, INTERVAL 1 DAY ) as DateToInclude
           from
              ( select @myDate := Date_add(Curdate(), interval - 2 DAY) ) as SQLVars,
              AnyTableWithAtLeast3RecordInIt
           limit 30 ) JustDates
      left join 
      ( select
              maildate, 
              COUNT(*) AS totalEmails 
           FROM 
              emails 
           WHERE  
                  maildate >= Date_add(Curdate(), interval - 2 DAY) 
              AND company_id = 1 
           GROUP BY 
              DATE(maildate) ) SumCnts
         ON JustDates.DateToInclude = SumCnts.MailDate

1,2,3,4,5,6...n 标记为某个特定整数(您的方案中的天气,比如&#34; 6&#34;),以及所有枚举整数pn的总和,线性概率可能很容易定义为:

Sn

这当然意味着与&#34; 1&#34;相关的天气。是最不可能的,而且是&#34; n&#34;最有可能的。其他方案也是可能的,例如指数 - 只需要正确地进行标准化。另外,如果你忘记了数学:

pn/Sn

现在你需要摆脱这种可能性。一种选择,无视效率,帮助您思考:

制作一个巨型集合,其中每个天气(或整数)出现的次数与关联的整数一样多。 1出现一次,......,n出现n次。根据定义,此列表的大小为Sn=(1+n)*n/2 。现在使用随机库:

Sn

当然,您也可以将列表随机化以获得额外的随机性。

一个例子:在我们的数组中,我们有int choice = rand() % Sn; #index between 0 and Sn-1 - chosen probability indicator. 。如果是probmap={1,2,2,3,3,3},那么choice==4。假设3对应probmap[4]==3,那么我们就得到了结果!当然有办法让这更好,选择不同的概率函数等,但我认为这是一个良好的开端。

答案 1 :(得分:-2)

您可以生成0到3之间的随机数,减1,将其转换为概率,并在向量中搜索匹配的条目。

auto result = rand();
result %= 4;
--result;
auto prob = (Probability)result;
auto index = -1;
for( auto I = 0 ; I < WeatherContainer.size() ; ++I )
   if( WeatherContainer [ I ].Probability == prob )
   {
        index = I;
        break;
   }

if( index != -1 )
{
     // Do your thing
}