【问题标题】:Inaccurate probability calculation with random [duplicate]随机的概率计算不准确[重复]
【发布时间】:2018-06-01 11:06:01
【问题描述】:

我有一个游戏,出口会触发一种骰子,可以引导你进入随机关卡。我有这样的脚本:

public string levelToLoad; // first level
public bool levelSplit; //Do we split?
public string levelToSplit; //second levl
public int splitLevelChance; //if the chance was 4/7, this should be the 4
public int SplitDenominator; //And this should be the 7

int normal = 0;  //To keep count
int split = 0;

for (int i = 0; i < 2000; i++) //Run the test 2000 times
{
    System.Random rnd = new System.Random();

    int dice = rnd.Next(1, SplitDenominator + 1); //Roll a dice
    print(dice);

    if (dice <= splitLevelChance)
    {
        normal++;
      //  SceneManager.LoadScene(levelToLoad);
    }
    else
    {
        split++;
       // SceneManager.LoadScene(levelToSplit);
    }
}

print("normal: " + normal);
print("split:" + split);

所以这适用于 1/4 或 1/8 之类的东西,但是当我这样做时,例如 8/ 18,它是不准确的。

以下是我对 8/18 所做的测试

测试 1 - 正常 = 899,拆分 = 1101

测试 2 - 正常 = 879,拆分 = 1121

测试 3 - 正常 = 885,拆分 = 1115

如果我的数学是正确的,正常应该在 615 左右并拆分 1385

编辑:我的数学错了,代码实际上可以正常工作

【问题讨论】:

  • 我做到了,我看到您每次都在循环中创建一个新的Random 变量。由于初始种子基于Environment.Ticks 值,这意味着紧密循环将一遍又一遍地获得相同的“随机”值。我想这种事情可能会像你描述的那样把你的数字弄丢。
  • 结果有什么问题? 885/(885+1115) 不是大约 8/18 吗?
  • 看来我的代码实际上是对的,我的 irl 数学是错误的,哎呀
  • 好吧,我把它放在循环之外,它不会受伤,因为它给我的结果是一样的。不过谢谢你,我应该使用在线概率计算器而不是我的脑袋
  • 由于这个问题是基于一个错误的前提,最好现在就删除它

标签: c# unity3d


【解决方案1】:

您需要将新的 Random 拉出循环。

System.Random rnd = new System.Random();
for (int i = 0; i < 2000; i++) //Run the test 2000 times
{

种子是基于时间的,因此它会在多个循环中获得相同的种子。

【讨论】:

  • 投反对票我可以问这个问题吗?
  • 这没有什么区别,如果我得到的值每次都相同,我在我的问题中完成的测试会回来,正常 = 2000,拆分 = 0 或反之亦然。顺便说一句,那不是我投反对票的人,我不会注意它,这里的人可能会令人讨厌,但我个人感谢你试图提供帮助
  • 投了反对票,因为如果这 答案(cmets 说不是),它就是一个明显的重复,不需要第 100000 个重复的答案
  • 确实@CamiloTerevinto 在这里是正确的。虽然涉及Random 的大多数问题通常是明显重复的,但这与该问题无关。
  • @RachelDockter Camilo 说这不是骗子,请仔细阅读。
猜你喜欢
  • 1970-01-01
  • 2017-10-01
  • 2021-01-15
  • 2012-10-06
  • 1970-01-01
  • 1970-01-01
  • 2018-08-29
  • 1970-01-01
相关资源
最近更新 更多