Javascript 我能用返回加权布尔值的函数实现加权随机性吗?

Javascript 我能用返回加权布尔值的函数实现加权随机性吗?,javascript,random,Javascript,Random,我有一种模仿不公平硬币的方法。您可以传入一个百分比,它通过返回一个布尔值来告诉您是否成功。因此,如果用.25调用它,它将在25%的时间内返回true25% 我试图找出是否可以使用此函数创建一个加权随机函数,其工作原理如下:它返回x的概率为25%,返回y的概率为40%,返回z的概率为35%。这只是一个示例。我希望函数可以处理无限数量的字母,但加在一起的百分比应该等于1 诀窍是,我希望能够以我刚才描述的方式来思考它。换言之: result = function ({.25, x}, {.4, y},

我有一种模仿不公平硬币的方法。您可以传入一个百分比,它通过返回一个布尔值来告诉您是否成功。因此,如果用.25调用它,它将在25%的时间内返回
true
25%

我试图找出是否可以使用此函数创建一个加权随机函数,其工作原理如下:
它返回x的概率为25%,返回y的概率为40%,返回z的概率为35%。
这只是一个示例。我希望函数可以处理无限数量的字母,但加在一起的百分比应该等于1

诀窍是,我希望能够以我刚才描述的方式来思考它。换言之:

result = function ({.25, x}, {.4, y}, {.35, z})
结果
应为25%的时间,依此类推。我可以用我的Undercoin实现这个功能吗


下面是我在评论中的措辞。这可能会澄清我的要求:

如果我在这里犯了错误,请更正我的逻辑,但假设XY和Z都有.3333。。。我不能用我不公平的硬币来传球吗。。。如果返回true,则表示结果为X。如果返回false,则再次调用my Unfaced。5如果返回true,则返回Y,否则返回Z。如果这是正确的,如果数字不是.3333,并且如果有三个以上的硬币,则我不知道如何使其工作。如果你有已知概率为人头的硬币 假设您有一个函数
infaircoin(p)
,该函数以已知的概率
p
产生正面,否则产生反面。例如,它可以这样实现:

function unfairCoin(p) {
   return Math.random() < p ? True : false;
}
如果你有硬币的头部概率未知 另一方面,如果您有一个函数
COIN
,它以未知的概率输出正面,反之则输出反面,那么要获得解决方案,需要解决两个问题:

  • 如何把有偏见的硬币变成公平的硬币
  • 如何把一枚漂亮的硬币变成一个装满硬币的骰子
  • 换句话说,我们的任务是把一枚有偏见的硬币变成一个有负载的骰子

    让我们看看如何解决这两个问题

    从有偏见的硬币到公平的硬币 假设您有一个函数
    COIN()
    ,它以未知的概率输出正面,否则输出反面。(如果已知硬币产生人头的概率为0.5,则您已经拥有一枚公平的硬币,可以跳过此步骤。)

    在这里,我们可以使用冯·诺依曼1951年的算法,将有偏见的硬币变成公平的硬币。它的工作原理如下:

    function unfairCoin(p) {
       return Math.random() < p ? True : false;
    }
    
  • 翻转硬币()两次
  • 如果两个结果都是正面或反面,请转至步骤1
  • 如果第一个结果为正面,另一个结果为反面,则以正面作为最终结果
  • 如果第一个结果是tails,另一个结果是heads,则以tails作为最终结果
  • 现在我们有了一个公平的硬币
    FAIRCOIN()

    (请注意,有其他方法可以通过这种方式产生公平的硬币,统称为随机抽取器,但冯·诺依曼方法可能是最简单的。)

    从普通硬币到装骰子 现在,将公平的硬币变成装满的骰子的方法要复杂得多。可以说,有很多方法可以解决这个问题,其中最新的一种被称为,它只使用普通硬币生产一个装模(事实上,它平均使用6个普通硬币投掷,超过了生产每个装模辊的最佳数量)。该算法的实现并不简单,但请参见快速加载骰子辊的作者的my和

    请注意,要使用快速加载的骰子滚轮,您需要将每个概率表示为整数权重(例如示例中的25、40、35)。

    如果您的硬币的正面概率已知 假设您有一个函数
    infaircoin(p)
    ,该函数以已知的概率
    p
    产生正面,否则产生反面。例如,它可以这样实现:

    function unfairCoin(p) {
       return Math.random() < p ? True : false;
    }
    
    如果你有硬币的头部概率未知 另一方面,如果您有一个函数
    COIN
    ,它以未知的概率输出正面,反之则输出反面,那么要获得解决方案,需要解决两个问题:

  • 如何把有偏见的硬币变成公平的硬币
  • 如何把一枚漂亮的硬币变成一个装满硬币的骰子
  • 换句话说,我们的任务是把一枚有偏见的硬币变成一个有负载的骰子

    让我们看看如何解决这两个问题

    从有偏见的硬币到公平的硬币 假设您有一个函数
    COIN()
    ,它以未知的概率输出正面,否则输出反面。(如果已知硬币产生人头的概率为0.5,则您已经拥有一枚公平的硬币,可以跳过此步骤。)

    在这里,我们可以使用冯·诺依曼1951年的算法,将有偏见的硬币变成公平的硬币。它的工作原理如下:

    function unfairCoin(p) {
       return Math.random() < p ? True : false;
    }
    
  • 翻转硬币()两次
  • 如果两个结果都是正面或反面,请转至步骤1
  • 如果第一个结果为正面,另一个结果为反面,则以正面作为最终结果
  • 如果第一个结果是tails,另一个结果是heads,则以tails作为最终结果
  • 现在我们有了一个公平的硬币
    FAIRCOIN()

    (请注意,有其他方法可以通过这种方式产生公平的硬币,统称为随机抽取器,但冯·诺依曼方法可能是最简单的。)

    从普通硬币到装骰子 现在,将公平的硬币变成装满的骰子的方法要复杂得多。可以说,有很多方法可以解决这个问题,其中最新的一种被称为,它只使用普通硬币生产一个装模(事实上,它平均使用6个普通硬币投掷,超过了生产每个装模辊的最佳数量)。该算法的实现并不简单,但请参见快速加载骰子辊的作者的my和

    请注意,要使用快速加载的骰子滚轮,您需要将每个概率表示为整数权重