【问题标题】:How to create a probability by a given percentage?如何按给定百分比创建概率?
【发布时间】:2012-10-31 18:37:08
【问题描述】:

我正在尝试为游戏创建基于百分比的概率。例如。如果一件物品有 45% 的几率造成暴击,那一定意味着 100 次命中中有 45 次是暴击。

首先,我尝试使用一个简单的解决方案:

R = new Random();
int C = R.Next(1, 101);
if (C <= ProbabilityPercent) DoSomething()

但是在 100 次迭代中,例如48%,它给出了 40-52 分(满分 100 分)。 49、50、51 也是如此。 所以,这些“百分比”之间没有区别。

问题是如何设置例如百分比50,并随机获得 100 个中的 50 个? 有机会增加找到稀有物品的机会是一件非常重要的事情。所以 1% 的增益是明智的,因为现在不是。

对不起,我的英语不好。

【问题讨论】:

  • 你必须明白“严格 50% 随机”不是随机的
  • 确保您了解随机性。
  • 这意味着如果 a 有 50% 的机会在 10 位的二进制序列中获得“1”,它将是 0,1,0,0,0,1,1,0,1, 1 为例。但仍然 - 5个“1”。随机发生,严格计数。
  • @maelstrom:那么这并不是随机的。它是在池中随机的,而不是真正随机的。像一副牌一样随机,不像掷骰子那样随机。
  • 另外;必须在 哪个 窗口中测量 100 个角色?如果它是一个 滑动 窗口,那么唯一有效的解决方案是不断重复相同的 100 个结果 - 非常非随机。

标签: c# probability probability-theory


【解决方案1】:

由于我不是 C# 方面的专家,因此我将使用 C++ 函数来简化,但仍然适用于任何语言。

rand() - 随机数生成器。

//33.34%
double probability = 0.3334;

//divide to get a number between 0 and 1
double result = rand() / RAND_MAX;
if(result < probability)
   //do something

我已经使用这种方法创建了非常大的渗透网格,它对于精度值非常有效。

【讨论】:

    【解决方案2】:

    我正在尝试为游戏创建基于百分比的概率。例如。 如果一件物品有 45% 的几率造成致命一击,那一定意味着它是 45 100 次点击将是至关重要的。

    不,那不是真的。您完全误解了概率的概念。您不想要“基于百分比的概率”,您想要“基于百分比的 100 个样本的随机分布”。

    您需要的是“事件包”,其中 45 个是“关键”,其中 55 个是“非关键”。一旦您从包中选择了一个事件,您下次只能选择剩余的事件。

    你可以这样建模:

    Initialize two integer variables Crytical and NonCrytical so that they sum exactly 100 according to the desired percetnages.
    
    Get a random value from 1 to Crytical+NonCrytical
    
    If the random value is less than the value of Crytical, let you hit be crytical and:
    
       Crytical = Crytical -1
    
    Else, let your hit be non-crytical
    
       NonCrytical = NonCrytical-1
    
    End If
    
    Repeat until Crytical+NonCrytical = 0
    

    【讨论】:

      【解决方案3】:

      您只需要考虑重复滚动的均匀分布。

      你不能查看超过 100 个卷,因为强制它产生恰好 45 不会是随机的。通常,这样的卷应该表现出“缺乏记忆”。例如,如果您掷骰子寻找 6,则您有六分之一的机会。如果你投了 5 次,但没有得到 6 - 那么:下一次得到 6 的机会不是 1。它仍然是 6 分之一。因此,你只能看它的匹配程度摊销到统计上大量的事件时您的期望... 100,000 说。

      基本上:您当前的代码很好。如果用户知道(因为他们已经击中了 55 次而没有重击)接下来的 45 次击中必须是重击,那么它就不再是随机的,他们可以游戏系统。

      还有; 45%的暴击几率似乎有点高;p

      【讨论】:

      • @maelstrom 我以为这只是“最大杀戮的令人敬畏的神圣混沌死亡之锤”
      • 非常感谢,我明白你的意思了。也许我对暗黑破坏神II Magic Find 的概念有点认真。我认为它比我的代码复杂得多。
      • DII MF 更加复杂,因为它的收益递减。 100% MF 并不能保证只找到蓝色和更好的武器。 :)
      • @Davio 如果您能告诉我有关此系统的更多信息,我们将不胜感激。我知道“收益递减”意味着较小值之间的差异要大于较大值之间的差异。但是我怎样才能实现这样的系统呢?
      【解决方案4】:

      问题是,对于Random,您可能只想初始化这个类一次。

      这是因为Random 使用系统时间作为生成随机数的种子。 如果您的循环非常快,则可能会发生多个随机实例使用相同的种子并因此生成相同的数字。

      如果您怀疑发生这种情况,请检查生成的数字。

      除此之外,随机性的固有特性是它不会为您提供准确的结果。 这意味着即使有 50/50 的机会,100 个“正面”或“反面”的序列也可能出现 100 次“正面”。

      您唯一能做的就是创建一次随机实例并接受结果;否则你不应该使用 Random。

      【讨论】:

      • 好的,他说的是“迭代”,所以我认为他可能使用了循环,所以我想警告他在循环中初始化 Random 可能产生的副作用。
      • 我使用循环进行测试。我在循环之前初始化了 Random。
      猜你喜欢
      • 1970-01-01
      • 2013-12-24
      • 1970-01-01
      • 1970-01-01
      • 2018-12-13
      • 1970-01-01
      • 1970-01-01
      • 2019-11-10
      • 1970-01-01
      相关资源
      最近更新 更多