对我来说,这是一个非常奇怪的问题,因为我无法正确地查看我的问题。只是为了让你知道,我并不是真的要求代码而只是为了一个想法来编写一个适当的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;变量并将其与每个元素或类似事物的概率进行比较。
任何提示或建议都会非常有用。
映入眼帘,
需要
答案 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
}