Ruby - как выбрать один случайный символ из двух диапазонов - PullRequest
0 голосов
/ 24 февраля 2019

У меня есть два диапазона - 97..122 и 49..57 (это буквы и цифры).Я могу сделать, например, rand (97..122) .chr, чтобы получить случайную букву.

Если я хочу, чтобы цифра была либо цифрой, либо цифрой, как я могу это сделать?
Что-то вроде rand([97..122, 49..57]).chr
Но я не уверен, как сложить диапазоны вместе - rand берет диапазон, но не принимает его.

Ответы [ 5 ]

0 голосов
/ 24 февраля 2019

Может быть, выборка из массива, содержащего два случайных числа, сгенерированных из диапазонов?Для взвешивания вероятности, так как 26 / 9≈3:

([rand(97..122)]*3 << rand(49..57)).sample.chr
0 голосов
/ 24 февраля 2019

Числа 0-9 и все буквы, то есть, как числа представлены в базе 36:

rand(36).to_s(36)
0 голосов
/ 24 февраля 2019

Вы можете сделать это с условной выборкой:

rand <= 26r / 35 ? rand(97..122).chr : rand(49..57).chr

, которая избегает массива за счет рисования дополнительного случайного значения.26 - длина первого диапазона, 35 - объединенная длина обоих диапазонов, поэтому в 26 из 35 раз вы рисуете значения из первого диапазона, а остальное время - из второго.

0 голосов
/ 24 февраля 2019

Два способа избежать создания массива.

# 1

rand(35).yield_self {|rn| rn + (rn < 10 ? 49 : 87)}.chr

Примечание:

35 = 57-48 + 122-96

и

10 = 58-48

# 2 ¯ \ _ (ツ) _ / ¯

"0123456789abcdefghijklmnopqrstuvwxyz"[rand 36]
0 голосов
/ 24 февраля 2019

Вы можете преобразовать диапазон в массив:

((97..122).to_a + (49..57).to_a).sample.chr

или

(Array(97..122) + Array(49..57)).sample.chr

или

([*97..122] + [*49..57]).sample.chr
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...