基于不同因素的随机数生成

时间:2013-05-19 10:27:14

标签: c# algorithm random

我想写一个随机数生成算法。但我不希望这些数字完全随机。我希望它们依赖于许多不同的因素。根据因素,我指的是值介于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之间的随机数或一个检票口。

我正在编写这个算法来模拟板球比赛。

我可以采用什么方法来编写这样的算法?

1 个答案:

答案 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,例子也在评论上