Сгенерировать псевдослучайную строку A-Z, 0-9

Как я могу создать псевдослучайную строку n-символа, содержащую только A-Z, 0-9 как SecureRandom.base64 без "+", "/" и "="? Например:

(0..n).map {(('1'..'9').to_a + ('A'..'Z').to_a)[rand(36)]}.join

Ответ 1

Array.new(n){[*"A".."Z", *"0".."9"].sample}.join

Ответ 2

Даже грубая сила довольно проста:

n = 20

c = [*?A..?Z + *?0..?9]
size = c.size
n.times.map { c[rand(size)] }.join
  #=> "IE210UOTDSJDKM67XCG1"

или, без замены:

c.sample(n).join
  #=> "GN5ZC0HFDCO2G5M47VYW"

если это необходимо. (Я изначально имел c = [*(?A..?Z)] + [*(?0..?9)], но видел из ответа @sawa, что это можно было бы упростить совсем немного.)

Ответ 3

Элегантный способ сделать это в Rails 5 (я не тестирую это в других версиях Rails):

SecureRandom.urlsafe_base64(n)

где n - это количество цифр, которое вы хотите.

ps: SecureRandom использует массив для монтирования вашей буквенно-цифровой строки, поэтому имейте в виду, что n должно быть количеством цифр, которое вы хотите + 1.

например: если вы хотите 8-значный буквенно-цифровой:

SecureRandom.urlsafe_base64(9)

Ответ 4

Чтобы создать случайную строку от 10 до 20 символов, включая только от А до Я и числа, оба всегда:

require 'string_pattern'

puts "10-20:/XN/".gen