【问题标题】:How to program an unfair or biased coin flip in Ruby?如何在 Ruby 中编写不公平或有偏见的抛硬币程序?
【发布时间】:2016-05-09 09:06:12
【问题描述】:

我需要按照一定的结果概率进行掷硬币。例如,掷硬币有 67% 的机会出现正面,83% 的机会出现反面等。

通过在等效分布中填充 100 个 truefalse 的数组,然后随机选择一项,我设法得到了我想要的结果。有什么更优雅的方法?

【问题讨论】:

  • 在询问时,我们希望得到以下两种情况之一:展示问题的代码的最小示例,或您搜索的地点列表以及解释为什么这些地点不能帮助您解决问题。阅读“How to Ask”和“minimal reproducible example”。您的问题看起来像是您希望我们编写解决问题的代码,这不是 Stack Overflow 的用途。相反,我们在这里通过纠正错误来帮助您解决问题。请向我们展示您的代码。
  • 我一直在寻找一种不同的方法,而不是解决问题的方法,因为我已经有了可以有效解决问题的代码,如上所述,但我并不满意。什么地方更适合要求这样的事情?
  • Code Review 在您有工作代码并想知道是否可以编写得更好时很有用。您提出的问题在那里不合适,就像在 SO 上存在问题一样,因为不清楚您是如何编写代码的。讨论代码不如展示演示它所需的最少代码有用或有效。
  • 我不同意,展示我写的代码比没用更糟糕,首先因为我特意要求另一种方法,其次因为它可能会误导一些人认为他们应该基于它来回答,这又完全属于我们的问题范围。所以我会得到“优化”无用代码的答案,这不会为任何人提供服务。

标签: ruby probability coin-flipping


【解决方案1】:

Random#rand(max)(和Kernel#rand(max)):

当 max 为 Integer [大于等于 1] 时,rand 返回一个大于等于 0 且小于 max..的随机整数。

所以:

p = rand(100)
return p < 83  # ie. true for heads

理论上,这可以像数组分布方法一样“精确”。

【讨论】:

    【解决方案2】:
    rand < 0.67
    rand < 0.83
    

    将分别以 67% 和 83% 的概率给出 true - 因为统一选择的随机数 x0 &lt;= x &lt; 1(例如由 Kernel#rand 返回)将有 67% 的可能性登陆段0 &lt;= x &lt; 0.67

    【讨论】:

    • 我将不得不接受另一位发帖人的回答,因为他首先给出了基本相同的答案,但这确实非常优雅!我现在觉得自己很蠢。
    • 不太一样:你可以用这种方法做任意概率(例如rand &lt; 0.12834)。
    • 第二种情况应该是rand &lt; 0.17吗?
    • @sagarpandya82:我不是在处理正面或反面,只是在处理概率。如果你想要特定的代码,我想应该是 rand &lt; 0.67 ? :heads : :tailsrand &lt; 0.83 ? :tails : :heads... 显然,它们也可以用其他方式编写。
    猜你喜欢
    • 2011-07-22
    • 2014-05-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多