我有一系列抽奖的随机数字。
我如何选择第二名的随机数等等,而没有再次拉出第一名的风险?
$first = rand(0..99999)
$second = rand(0..99999)
$third = rand(0..99999)
我需要在以下图纸中得到某种例外。
答案 0 :(得分:10)
shuffle
将置换整个数组,这对于大型数组来说可能很慢。 sample
是一个更快的操作
(1..99999).to_a.sample(3)
出于基准测试的目的:
> require 'benchmark'
> arr = (0..99999).to_a; 0
> Benchmark.realtime { 10_000.times { arr.sample(3) } }
=> 0.002874
> Benchmark.realtime { 10_000.times { arr.shuffle[0,3] } }
=> 18.107669
答案 1 :(得分:3)
如果您从大型阵列中挑选出极少数的数字,那么只需获得3个随机数并检查它们是不同的就可能是明智的:
def create_array_and_pick_three
arr = (0..99999).to_a
arr.sample(3)
end
def get_three_random_until_uniq
array, num = [], 3
array = (1..num).map{rand(0..99999)} until array.uniq.size == num
end
p Benchmark.realtime { 1000.times { create_array_and_pick_three }} #=> 4.343435
p Benchmark.realtime { 1000.times { get_three_random_until_uniq }} #=> 0.002
究竟什么对你来说更快取决于数组的大小和你需要的随机数。