Преобразуйте строку последовательно в случайный процент от 0 до 100

Для мягкого развертывания новых функций я хочу, чтобы мой сервер с флагами функций возвращал процентное число, а затем чтобы клиент выяснил, на какой стороне процента он находится. Я хочу использовать идентификатор пользователя, чтобы сделать этот выбор последовательно, чтобы отдельный пользователь всегда видел одну и ту же сторону флага.

Я дошел до

(crypto.createHash('md5').update(userID).digest('hex').charCodeAt(0)

Который хэширует идентификатор (который будет большой строкой), затем берет первый символ хэша и преобразует его в целочисленный идентификатор. К сожалению, это число, по-видимому, не является случайным распределением, поэтому даже если я смещу и умножу его так, чтобы оно всегда находилось между 0 и 100, оно не кажется случайным даже. Вот несколько хэшей случайных строк, которые я запускал:

checking  25
15.2
checking  26
96.89999999999999
checking  27
98.8
checking  28
13.299999999999999
checking  29
15.2
checking  30
102.6
checking  31
15.2
checking  32
7.6
checking  33
102.6
checking  34
15.2
checking  35
102.6
checking  36
15.2
checking  37
7.6
checking  38
96.89999999999999
checking  39
96.89999999999999
checking  40
7.6
checking  41
100.69999999999999
checking  42
13.299999999999999
checking  43
96.89999999999999
checking  44
93.1
checking  45
96.89999999999999
checking  46
1.9
checking  47
15.2
checking  48

Есть ли лучший способ сделать эту проверку, чтобы она создала случайное распределение процентов?

1 ответ

Я пришел с этим, который, кажется, работает довольно хорошо:

parseInt(crypto.createHash('md5').update(flagName+ userID).digest('hex'), 16).toString().substring(4, 6)

Это немного безумно, но, похоже, работает хорошо. ParseInt создает огромное число, а затем я получаю цифры из десятичного числа.

checking  D
17
checking  N
23
checking  F
17
checking  J
30
checking  Z
76
checking  L
20
checking  N
23
checking  X
50
checking  L
20
checking  F
17
checking  H
67
checking  U
52
checking  H
67
checking  3
75
checking  8
42
checking  2
00
checking  9
37
checking  3
75
checking  5
19
checking  0
21
checking  1
57
checking  3
75
checking  9
37
checking  4
97
checking  5
19
checking  0
21
checking  d
42
checking  k
27
checking  l
77
checking  z
53
checking  i
59
Другие вопросы по тегам