Как сгенерировать случайную строку в Ruby

Вот как импортировать строку в качестве модуля ( Python 2.x ):

import sys,imp

my_code = 'a = 5'
mymodule = imp.new_module('mymodule')
exec my_code in mymodule.__dict__

В Python 3 , exec является функция, поэтому это должно работать:

import sys,imp

my_code = 'a = 5'
mymodule = imp.new_module('mymodule')
exec(my_code, mymodule.__dict__)

Теперь получить доступ к атрибутам модуля (и функциям, классам и т. д.) как:

print(mymodule.a)
>>> 5

Чтобы игнорировать следующую попытку импорта, добавьте модуль в sys:

sys.modules['mymodule'] = mymodule
719
задан 4 revs, 2 users 81% 13 April 2017 в 19:22
поделиться

17 ответов

(0...8).map { (65 + rand(26)).chr }.join

я провожу слишком много времени, играя в гольф.

(0...50).map { ('a'..'z').to_a[rand(26)] }.join

И последний это еще более сбивает с толку, но более гибко и тратит впустую меньше циклов:

o = [('a'..'z'), ('A'..'Z')].map(&:to_a).flatten
string = (0...50).map { o[rand(o.length)] }.join
930
ответ дан 12 revs, 10 users 62% 13 April 2017 в 19:22
поделиться

Мне нравится ответ Радара лучше всего, до сих пор, я думаю. Я настроил бы немного как это:

CHARS = ('a'..'z').to_a + ('A'..'Z').to_a
def rand_string(length=8)
  s=''
  length.times{ s << CHARS[rand(CHARS.length)] }
  s
end
2
ответ дан webmat 13 April 2017 в 19:22
поделиться

С этим методом можно передать в abitrary длине. Это установлено как значение по умолчанию как 6.

def generate_random_string(length=6)
  string = ""
  chars = ("A".."Z").to_a
  length.times do
    string << chars[rand(chars.length-1)]
  end
  string
end
2
ответ дан Ryan Bigg 13 April 2017 в 19:22
поделиться

Сделать Ваше первое в один оператор:

(0...8).collect { |n| value  << (65 + rand(25)).chr }.join()
0
ответ дан Kevin Conner 13 April 2017 в 19:22
поделиться

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

 (1..8).map{|i| ('a'..'z').to_a[rand(26)]}.join
-1
ответ дан Purfideas 13 April 2017 в 19:22
поделиться

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

преимущество здесь состоит в том что, если строка, как предполагается, является пользователем-enterable, то можно исключить легко перепутанные символы как l и 1 и я, 0 и O, 5 и S, и т.д.

-9
ответ дан nsayer 13 April 2017 в 19:22
поделиться

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

class String

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

end

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

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

0
ответ дан Carlos Villela 13 April 2017 в 19:22
поделиться
require 'sha1'
srand
seed = "--#{rand(10000)}--#{Time.now}--"
Digest::SHA1.hexdigest(seed)[0,8]
11
ответ дан Coren 13 April 2017 в 19:22
поделиться

Это решение генерирует строку легко читаемых символов для кодов активации; я не хотел людей, путающих 8 с B, 1 со мной, 0 с O, L с 1, и т.д.

# Generates a random string from a set of easily readable characters
def generate_activation_code(size = 6)
  charset = %w{ 2 3 4 6 7 9 A C D E F G H J K M N P Q R T V W X Y Z}
  (0...size).map{ charset.to_a[rand(charset.size)] }.join
end
168
ответ дан 2 revs, 2 users 86%ImNotQuiteJack 14 April 2017 в 05:22
поделиться

Я могу ' Не помню, где я это нашел, но мне кажется, что это лучший и наименее интенсивный процесс:

def random_string(length=10)
  chars = 'abcdefghjkmnpqrstuvwxyzABCDEFGHJKLMNPQRSTUVWXYZ0123456789'
  password = ''
  length.times { password << chars[rand(chars.size)] }
  password
end
30
ответ дан 22 November 2019 в 21:30
поделиться

Почему бы не использовать SecureRandom?

require 'securerandom'
random_string = SecureRandom.hex

# outputs: 5b5cd0da3121fc53b4bc84d0c8af2e81 (i.e. 32 chars of 0..9, a..f)

SecureRandom также имеет методы для:

  • base64
  • random_bytes
  • random_number

см .: http: // ruby- doc.org/stdlib-1.9.2/libdoc/securerandom/rdoc/SecureRandom.html

782
ответ дан 22 November 2019 в 21:30
поделиться
[

] Другой метод, который я люблю использовать:[

] [
 rand(2**256).to_s(36)[0..7]
] [

]Add []ljust[] if you are really paranoid about the correct string length:[

] [
 rand(2**256).to_s(36).ljust(8,'a')[0..7]
]
7
ответ дан 22 November 2019 в 21:30
поделиться

Ruby 1.9+:

ALPHABET = ('a'..'z').to_a
#=> ["a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l", "m", "n", "o", "p", "q", "r", "s", "t", "u", "v", "w", "x", "y", "z"]

10.times.map { ALPHABET.sample }.join
#=> "stkbssowre"

# or

10.times.inject('') { |s| s + ALPHABET.sample }
#=> "fdgvacnxhc"
10
ответ дан 22 November 2019 в 21:30
поделиться

Я недавно делал что-то подобное, чтобы сгенерировать 8-байтовую случайную строку из 62 символов. Символы были 0-9, a-z, A-Z. У меня был их массив, так как он 8 раз зацикливался и выбирал случайное значение из массива. Это было внутри приложения Rails.

str = ''
8.times {|i| str << ARRAY_OF_POSSIBLE_VALUES[rand(SIZE_OF_ARRAY_OF_POSSIBLE_VALUES)] }

Странно то, что у меня много дубликатов. Случайным образом этого никогда не должно происходить. 62 ^ 8 огромен, но из примерно 1200 кодов в db у меня было хорошее количество дубликатов. Я заметил, что они происходят на часовых границах друг друга. Другими словами, я мог бы увидеть дуплекс в 12:12:23 и 2:12:22 или что-то в этом роде ... не уверен, проблема во времени или нет.

Этот код был перед созданием объекта ActiveRecord. Перед созданием записи этот код запускался и генерировал «уникальный» код. Записи в БД всегда производились надежно, но код ( str в строке выше) слишком часто дублировался.

Я создал сценарий для выполнения 100000 итераций указанной выше строки с небольшой задержкой, так что это заняло бы 3-4 часа, надеясь увидеть какой-то повторяющийся шаблон на ежечасной основе, но ничего не увидел. Понятия не имею, почему это происходило в моем приложении Rails.

3
ответ дан 22 November 2019 в 21:30
поделиться

Я использую это для генерации случайных строк, удобных для URL, с гарантированной максимальной длиной:

rand(36**length).to_s(36)

Он генерирует случайные строки из строчных букв az и 0-9. Он не очень настраиваемый, но короткий и чистый.

245
ответ дан 22 November 2019 в 21:30
поделиться

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

-1
ответ дан 22 November 2019 в 21:30
поделиться
`pwgen 8 1`.chomp
0
ответ дан 22 November 2019 в 21:30
поделиться