这对我来说是一个很奇怪的问题,因为我无法正确地想象我的问题。只是为了让您知道,我并不是真正要求代码,而只是想写一个适当的算法,该算法会根据天气发生的概率生成一些天气。
这是我想要实现的目标:
假设我有一个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);
现在,我的问题是:根据天气自身发生的概率返回一些天气的最聪明的方法是什么?
我不知道为什么,但我想不通。我的第一个猜测是有某种“运气”变量,并将其与每个元素的概率或类似的东西进行比较。
任何提示或建议都会非常有帮助。
问候,
必需的
一般来说,假设您有一个表示概率线性增加的整数序列(从 1 开始,而不是从 0 开始!):
1,2,3,4,5,6...n
标记pn
一些特定的整数(你的计划中的天气,比如“6”),以及所有枚举整数的总和Sn
,线性概率可以很容易地定义为:
pn/Sn
这当然意味着与“1”相关联的天气可能性最小,而与“n”相关联的天气最有可能。其他方案也是可能的,例如指数 - 只需要正确归一化。另外,如果你忘记了你的数学:
Sn=(1+n)*n/2
现在你需要从这个概率滚动。一种不考虑效率的选择,可以帮助您考虑这一点:
制作一个巨大的集合,其中每个天气(或整数)出现的次数与相关的整数一样。1 出现一次,...,n 出现 n 次。Sn
根据定义,此列表具有一定的规模。现在使用随机库:
int choice = rand() % Sn; #index between 0 and Sn-1 - chosen probability indicator.
您当然也可以随机化列表以获得额外的随机性。
一个例子:在我们的数组中,我们有probmap={1,2,2,3,3,3}
. 如果choice==4
,那么probmap[4]==3
。假设 3 对应于Sunny
,那么我们就有了结果!。当然有办法让它变得更好,选择不同的概率函数等,但我认为这是一个好的开始。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句