Маленький генератор случайных строк, который, к сожалению, иногда не работает.Пожалуйста, помогите мне исправить это - PullRequest
2 голосов
/ 10 декабря 2010

Из какого-то ответа StackOverflow у меня есть эта небольшая аккуратная функция для генерации 10-символьной строки с только символами az и 0-9: rand(36**10).to_s(36)

Проблема в том, что иногда происходит сбой и генерируется только 9 символов.Но мне действительно нравится легкость и скорость.Любые предложения, как это исправить, чтобы я мог быть уверен, что он всегда генерирует ровно 10 символов?(Без каких-либо петель или проверки.)

Ответы [ 5 ]

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

Когда вы случайным образом генерируете число, меньшее 36 9 , оно заканчивается строкой из 9 символов. Левая клавиша это с нулями:

rand(36**10).to_s(36).rjust(10, "0")

Пример:

irb(main):018:0> (36**9).to_s(36)
=> "1000000000"
irb(main):019:0> (36**9 - 1).to_s(36)
=> "zzzzzzzzz"
irb(main):020:0> (36**5).to_s.rjust(10, "0")
=> "0060466176"
0 голосов
/ 12 февраля 2012
(('a'..'z').to_a + ('A'..'Z').to_a + (0..9).to_a).sample(8).join
0 голосов
/ 10 декабря 2010

Начиная с идеи использования rand(36**5) @Mark Rushakoff, это перетасовывает заполненную нулями строку для рандомизации символов:

('%010x' % [rand(36**5)]).chars.to_a.shuffle.join # => "4a04020701"
('%010x' % [rand(36**5)]).chars.to_a.shuffle.join # => "0e092f0a03"
('%010x' % [rand(36**5)]).chars.to_a.shuffle.join # => "03e240e800"

Чтобы обойти Ruby, не позволяющий заполнить нулями строки в format, я должен переключиться на заполнение в цепочке методов, что в основном и сделал Марк. Чтобы избежать строк ведущих нулей, это разбивает его обратно на массив, перетасовывает строку и присоединяет ее.

rand(36**5).to_s(36).rjust(10, '0').chars.to_a.shuffle.join # => "e80000h00b"
rand(36**5).to_s(36).rjust(10, '0').chars.to_a.shuffle.join # => "00bv0dy00p"
rand(36**5).to_s(36).rjust(10, '0').chars.to_a.shuffle.join # => "v0hw000092"
0 голосов
/ 10 декабря 2010

как насчет:

>> require 'md5'
=> true
>> MD5::hexdigest(Time.now.to_f.to_s)[0..9]
=> "89d83d3516"
0 голосов
/ 10 декабря 2010

Будет сгенерирована случайная строка символов и цифр, но ни один символ не появится более одного раза

(('a'..'z').to_a + (0..9).to_a).shuffle[1..10].join

Чтобы «зафиксировать» количество возможных результатов, вы просто делаете это:

a = (('a'..'z').to_a + (0..9).to_a)
a = a * 10
p a.shuffle[1..10].join
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...