1

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

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

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

4

1 回答 1

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。如果所有负面因素都为零,那么分布将包括 6 个最大值。我在源代码的评论中给出了这些因素的例子。

对于负面因素,您将允许它们将结果值减少到40%. 如果要包含 0 作为结果,还需要使这样的系数,使它们的总和为 1,示例也在注释中

于 2013-05-19T10:49:49.077 回答