![Ruby – 在一个数组中选取一个元素,有50%的几率获得[0],有25%的几率获得[1],第1张 Ruby – 在一个数组中选取一个元素,有50%的几率获得[0],有25%的几率获得[1],第1张](/aiimages/Ruby+%E2%80%93+%E5%9C%A8%E4%B8%80%E4%B8%AA%E6%95%B0%E7%BB%84%E4%B8%AD%E9%80%89%E5%8F%96%E4%B8%80%E4%B8%AA%E5%85%83%E7%B4%A0%2C%E6%9C%8950%EF%BC%85%E7%9A%84%E5%87%A0%E7%8E%87%E8%8E%B7%E5%BE%97%5B0%5D%2C%E6%9C%8925%EF%BC%85%E7%9A%84%E5%87%A0%E7%8E%87%E8%8E%B7%E5%BE%97%5B1%5D.png)
我想出了以下内容,并想知道是否有更好/更有效的方法来做到这一点.
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 } endend解决方法 首先猜测…选择一个介于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.不确定这是否比复杂的数学更好. 总结
以上是内存溢出为你收集整理的Ruby – 在一个数组中选取一个元素,有50%的几率获得[0],有25%的几率获得[1]全部内容,希望文章能够帮你解决Ruby – 在一个数组中选取一个元素,有50%的几率获得[0],有25%的几率获得[1]所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)