加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

Ruby – 在一个数组中选取一个元素,有50%的几率获得[0],有25%

发布时间:2020-12-17 01:45:00 所属栏目:百科 来源:网络整理
导读:没有什么太复杂,基本上我只是想从数组中选择一个元素,好像我正在为每个索引进行硬币抛出,并在我第一次得到头时选择索引.也没有头意味着我选择最后一个垃圾箱. 我想出了以下内容,并想知道是否有更好/更有效的方法来做到这一点. def coin_toss(size) random_nu
没有什么太复杂,基本上我只是想从数组中选择一个元素,好像我正在为每个索引进行硬币抛出,并在我第一次得到头时选择索引.也没有头意味着我选择最后一个垃圾箱.

我想出了以下内容,并想知道是否有更好/更有效的方法来做到这一点.

def coin_toss(size)
  random_number = rand(2**size)
  if random_number == 0
    return size-1
  else
    return (0..size-1).detect { |n| random_number[n] == 1 }
  end
end

解决方法

首先猜测…选择一个介于1和2 **之间的随机数,查找其中的日志基数2,然后从结尾选择许多元素的数字.

原谅我可怕的ruby技巧.

return a[-((Math.log(rand(2**size-1)+1) / Math.log(2)).floor) - 1]

如果rand返回0,则应选择最后一个元素. 1或2,倒数第二. 3,4,5或6,从结束的第三个.等等.假设随机数的均匀分布,每个元素的选择机会是后者的两倍.

编辑:实际上,它似乎有一个log2函数,所以我们不必做log / log(2)的事情.

return a[-(Math.log2(rand(2**size - 1)+1).floor) - 1]

你或许可以完全摆脱那些日志调用

return a[-((rand(2**size-1)+1).to_s(2).length)]

但是你要创建一个额外的String.不确定这是否比复杂的数学更好.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读