Как сгенерировать случайную строку в Ruby - PullRequest
710 голосов
/ 18 сентября 2008

В настоящее время я генерирую 8-символьную псевдослучайную строку в верхнем регистре для "A" .. "Z":

value = ""; 8.times{value  << (65 + rand(25)).chr}

но он не выглядит чистым и не может быть передан в качестве аргумента, поскольку это не одно утверждение. Чтобы получить строку со смешанным регистром "a" .. "z" плюс "A" .. "Z", я изменил ее на:

value = ""; 8.times{value << ((rand(2)==1?65:97) + rand(25)).chr}

но это похоже на мусор.

У кого-нибудь есть лучший метод?

Ответы [ 51 ]

0 голосов
/ 31 августа 2016
a='';8.times{a<<[*'a'..'z'].sample};p a

или

8.times.collect{[*'a'..'z'].sample}.join
0 голосов
/ 18 сентября 2008

Это почти так же уродливо, но, возможно, как шаг в правильном направлении?

 (1..8).map{|i| ('a'..'z').to_a[rand(26)]}.join
0 голосов
/ 18 сентября 2008

Мы использовали это в нашем коде:

class String

  def self.random(length=10)
    ('a'..'z').sort_by {rand}[0,length].join
  end

end

Максимальная поддерживаемая длина - 25 (мы все равно используем ее по умолчанию, поэтому проблем не было).

Кто-то упомянул, что 'a' .. 'z' неоптимально, если вы хотите полностью избежать создания оскорбительных слов. Одной из идей, которые у нас были, было удаление гласных, но вы все равно получили WTFBBQ и т. Д.

0 голосов
/ 21 июля 2009

В ruby ​​1.9 можно использовать метод выбора массива, который возвращает случайный элемент из массива

0 голосов
/ 26 мая 2010
`pwgen 8 1`.chomp
0 голосов
/ 26 апреля 2014
Array.new(8).inject(""){|r|r<<('0'..'z').to_a.shuffle[0]}  # 57
(1..8).inject(""){|r|r<<('0'..'z').to_a.shuffle[0]}        # 51
e="";8.times{e<<('0'..'z').to_a.shuffle[0]};e              # 45
(1..8).map{('0'..'z').to_a.shuffle[0]}.join                # 43
(1..8).map{rand(49..122).chr}.join                         # 34
0 голосов
/ 06 ноября 2018

Использование 'SafeRandom' Gem GithubLink

Это обеспечит самый простой способ генерирования случайных значений для Rails2, Rails 3, Rails 4, Rails 5 совместимых.

0 голосов
/ 30 июля 2013

Вот решение, которое является гибким и допускает дублирование:

class String
  # generate a random string of length n using current string as the source of characters
  def random(n)
    return "" if n <= 0
    (chars * (n / length + 1)).shuffle[0..n-1].join  
  end
end

Пример:

"ATCG".random(8) => "CGTGAAGA"

Вы также можете разрешить определенному персонажу появляться чаще:

"AAAAATCG".random(10) => "CTGAAAAAGC"

Пояснение: Вышеуказанный метод берет символы данной строки и генерирует достаточно большой массив. Затем он перетасовывает его, берет первые n элементов и затем присоединяет их.

0 голосов
/ 03 апреля 2013

Создайте пустую строку или предварительное исправление, если требуется:

myStr = "OID-"

Используйте этот код для заполнения строки случайными числами:

begin; n = ((rand * 43) + 47).ceil; myStr << n.chr if !(58..64).include?(n); end while(myStr.length < 12)

Примечания:

(rand * 43) + 47).ceil

Он будет генерировать случайные числа из 48-91 (0,1,2..Y, Z) * ​​1010 *

!(58..64).include?(n)

Используется для пропуска специальных символов (поскольку я не заинтересован в их включении)

while(myStr.length < 12)

Будет сгенерировано всего 12 символов длинной строки, включая префикс.

Пример вывода:

"OID-XZ2J32XM"
0 голосов
/ 21 марта 2019

Самый простой способ - использовать гем string_pattern https://github.com/MarioRuiz/string_pattern

Например, чтобы сгенерировать 36 случайных букв:

 require 'string_pattern'
 puts '36:L'.gen

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

 require 'string_pattern'
 puts /[a-zA-Z]{36}/.gen
...