我想写一个随机数生成算法。但我不希望这些数字完全随机。我希望它们依赖于许多不同的因素。根据因素,我指的是值介于0到1之间的变量。
所以因素可能是 -
Bounce // 0.56 // Should afffect the outcome by 10% // inversely proportional to outcome
Spin // 0.71 // Should afffect the outcome by 20% // inversely proportional to outcome
Light // 0.99 // Should afffect the outcome by 5% // directly proportional to outcome
Crowd Support // 1.00 // Should afffect the outcome by 5% // directly proportional to outcome
Pressure // 0.89 // Should afffect the outcome by 10% // inversely proportional to outcome
Experience // 0.76 // Should afffect the outcome by 10% // directly proportional to outcome
Skill // 0.56 // Should afffect the outcome by 40% // directly proportional to outcome
现在基于这些因素,我想生成一个0-6之间的随机数或一个检票口。
我正在编写这个算法来模拟板球比赛。
我可以采用什么方法来编写这样的算法?
答案 0 :(得分:3)
想法是单独计算所有因素的随机系数。您将获得较低的分布范围而不是结果特征。
int max = 6;
var rand = new Random();
//to make code cleaner, returns 0..1 double
Func<double> next = () => rand.NextDouble();
double result = - Bounce * max * 0.1 * next()
- Spin * max * 0.2 * next()
+ Light * max * 0.05 * next() //0.1
+ CrowdSupport * max * 0.05 * next() //0.1
- Pressure * max * 0.1 * next()
+ Experience * max * 0.1 * next() //0.2
+ Skill * max * 0.4 * next(); //0.6
//calculated based on weights and negative\positive character
//result would be in range 0 and 6 with
另一个想法是分别计算正面和负面因素,并将随机系数应用于所有这些因素,除以2并加上最大值的一半。你会得到0到6的随机分布。
double negativeFactor = Bounce * max * 0.25
+ Spin * max * 0.5
+ Pressure * max * 0.25;
double positiveFactor = Light * max * 0.1
+ CrowdSupport * max * 0.1
+ Experience * max * 0.2
+ Skill * max * 0.6;
double result = max / 2
+ positiveFactor * max * next() / 2
- negativeFactor * max * next() / 2;
正如Lasse V. Karlsen正确指出的那样,你需要以这种方式选择正因子的权重,这样它们的总和就是1.如果所有负面因子都为零,那么分布将包括六个最大值。我在源代码的注释中给出的这些因素的示例。
对于负面因素,您将允许它们将结果值减少到40%
。如果你想包含0作为结果,你还需要做出这样的系数,这样它们的总和就是1,例子也在评论上