Самая быстрая реализация генератора случайных чисел в Ruby? - PullRequest
0 голосов
/ 06 декабря 2010

Какой самый быстрый способ написать генератор случайных чисел в рубине?Существуют ли академические формулы для этого?

Я делаю это, и для 10000 случайных чисел это занимает около ~ 4 секунд:

def generate_random_num(count = 1)
  count.times.map do |i|
    # make a setting!
    num = rand(99999)
    num = "0" * (5 - num.to_s.length) + num.to_s
    redo if codes.include?(num)
    codes << num
  end
end

Я просто пытаюсь сгенерировать до 99999случайные числа, все 5 цифр.Любые советы?

1 Ответ

5 голосов
/ 06 декабря 2010

Это дает вам 10000 уникальных чисел (строк) с ведущими нулями:

(1..10000).to_a.shuffle!.map{|n| n.to_s.rjust(5,'0')}

Benchmark (с использованием Benchmark.measure ):

user       system     total       real
0.020000   0.000000   0.020000 (  0.017471)

Я бы, однако, просто использовал:

(1..10000).to_a.shuffle!

Что быстрее:

user       system     total       real
0.000000   0.000000   0.000000 (  0.001692)

И добавляйте начальные нули при выводе каждого значения. Согласно этому посту Руби shuffle использует алгоритм Фишера-Йейтса, о котором упоминал Саид.

Обновление:

Таким образом, чтобы ответить на ваш вопрос, вы можете сгенерировать 10000 уникальных случайных чисел в диапазоне [0,99999] со следующим кодом:

(0..99999).to_a.shuffle!.slice(0..9999).map{|n| n.to_s.rjust(5, '0')}

с эталоном:

user       system     total       real
0.020000   0.000000   0.020000 (  0.026122)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...