Ruby - 范围内的随机数,但有例外

时间:2013-11-25 12:16:23

标签: ruby exception random

我有一系列抽奖的随机数字。

我如何选择第二名的随机数等等,而没有再次拉出第一名的风险?

$first = rand(0..99999)
$second = rand(0..99999)
$third = rand(0..99999)

我需要在以下图纸中得到某种例外。

2 个答案:

答案 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

究竟什么对你来说更快取决于数组的大小和你需要的随机数。