Безопасный случайный уникальный номер в цикле - PullRequest
0 голосов
/ 16 октября 2018

У меня есть цикл, который добавляет числа в группы определенного числа, которые могут быть введены пользователем.

no_reps = @trial.number_of_repetitions

Я хочу ввести случайное число между одним и переменной no_repsв группах no_reps переменная.

Текущий r.treatment_index = SecureRandom.random_number(1..no_reps) не вводит уникальные числа.Значения соответствуют диапазону, но не являются уникальными для in_groups_of.

@trial.repetitions.in_groups_of(no_reps).each_with_index do |a, i|
  a.each do |r|
   r.repetition_index = i + 1
   r.treatment_index = SecureRandom.random_number(1..no_reps)
  end
end

1 Ответ

0 голосов
/ 16 октября 2018

Попробуйте #shuffle предварительно заполненный массив:

@trial.repetitions.in_groups_of(no_reps).each_with_index do |a, i|
  treatment_indexes = (1..no_reps).to_a.shuffle
  a.each_with_index do |r, j|
   r.repetition_index = i + 1
   r.treatment_index = treatment_indexes[j]
  end
end

UPD: Если вы позаботитесь о скорости:

treatment_indexes = (1..no_reps).to_a
@trial.repetitions.in_groups_of(no_reps).each_with_index do |a, i|
  treatment_indexes.shuffle!
  ...
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...