Что такое элегантная строка в Ruby, которая может генерировать случайную строку из 8 символов? - PullRequest
0 голосов
/ 16 апреля 2011

В Rails Tutorial есть строка:

('a'..'z').to_a.shuffle[0..7].join

, который может генерировать "zwnrfxte", но он не использует те же символы снова. Что такое элегантная линия, которая может? И тот, который может использовать как a..z, так и A..Z?

Ответы [ 5 ]

3 голосов
/ 16 апреля 2011

В 1.9 это можно сделать довольно чисто:

>> 8.times.map { [*?a..?z,*?A..?Z].sample }.join #=> "kmQQvuPd"

Символы будут повторяться, как показано в этом примере с меньшим диапазоном символов:

>> 8.times.map { [*?a..?c,*?A..?C].sample }.join #=> "CaACAaBa"

Возможно, вы хотитехранить массив букв в отдельной переменной:

>> letters = [*?a..?z,*?A..?Z] #=> ["A", "B", "C", ...]
>> 8.times.map { letters.sample }.join #=> "HBKKbnzx"
3 голосов
/ 16 апреля 2011
letters = ('a'..'z').to_a + ('A'..'Z').to_a
rand_string = (0..7).inject(""){|s| s << letters.sample}

или один вкладыш:

(0..7).inject(""){|s| s << (('a'..'z').to_a+('A'..'Z').to_a).sample}

При этом будет использоваться тот же символ (если он был выбран), и он имеет a-zA-Z.

Использование Массив # образец

2 голосов
/ 16 апреля 2011
a = ('a'..'z').to_a + ('A'..'Z').to_a 
0.upto(7).map{|x| a[ rand( a.size ) ] }
1 голос
/ 16 апреля 2011

Сочетание энтропии для криптографически безопасной случайности

File.open('/dev/random', 'r') { |f| f.sysread(8).tr "\0-\377", "a-zA-Z"*5 }

(по крайней мере для Linux / Unix / Mac.)

0 голосов
/ 16 апреля 2011

Просто, черт возьми, вот еще несколько:

8.times.map {(rand(26) + (rand > 0.5 ? 65 : 97)).chr}.join
 => "JnFHpIqb"

8.times.map {((r = rand(26)) > 13 ? r + 65 : r + 97).chr}.join
 => "PQYciXcg"

оба они могут быть адаптированы для использования инжект:

8.times.inject("") {|s| s += (rand(26) + (rand > 0.5 ? 65 : 97)).chr}
 => "WFkVqgeG"

8.times.inject("") {|s| s += ((r = rand(26)) > 13 ? r + 65 : r+ 97).chr}
 => "faQnScmd"
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...