Генерация неповторяющихся случайных чисел в Ruby - PullRequest
2 голосов
/ 27 февраля 2012

Я хочу создать последовательность уникальных случайных чисел от 100 до 999. Я хочу убедиться, что числа не генерируются дважды, чтобы гарантировать, что каждое число уникально. Вот что я придумал. Это не работает. Когда я запускаю его, экран просто пуст. Кто-нибудь может мне помочь?

products = {}

def random_key(products)

  rand_key = rand(900) + 100

  while products.has_key?(rand_key)

    rand_key = rand(900) + 100

  end

end

puts random_key(products)

Ответы [ 3 ]

13 голосов
/ 27 февраля 2012
a = (100..999).to_a.shuffle 

тогда каждый раз, когда вам нужен новый идентификатор

new_id = a.pop

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

0 голосов
/ 27 февраля 2012

Ваша функция возвращает выражение while, которое всегда равно nil.Вместо этого вы должны вернуть число:

def random_key(products)
  rand_key = rand(900) + 100
  while products.has_key?(rand_key)
    rand_key = rand(900) + 100
  end
  rand_key
end

Обратите внимание, что вы можете удалить дублирование, поместив «while» после генерации ключа:

def random_key(products)
  begin
    rand_key = rand(900) + 100
  end while products.has_key?(rand_key)
  rand_key
end

И вы можете опустить begin end для одноговыражение

def random_key(products)
  rand_key = rand(900) + 100 while products.has_key?(rand_key)
  rand_key
end
0 голосов
/ 27 февраля 2012

Обратите внимание, что последним оператором в вашем методе является цикл while, который не будет выполняться, если products пусто. Следовательно, функция возвращает nil.

Попробуй так:

products = {}

def random_key(products)

  rand_key = rand(900) + 100

  while products.has_key?(rand_key)

    rand_key = rand(900) + 100

  end

  rand_key

end

puts random_key(products)

Обратите внимание, что это может привести к бесконечному циклу, когда все числа от 100 до 999 находятся в products

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...