Я использовал $((1 + RANDOM % 1000))
для генерации случайного числа.
Можно ли сделать что-то подобное, но обеспечить семя?
Чтобы при одинаковом начальном числе всегда выводилось одно и то же случайное число?
Присвойте начальное значение RANDOM
$ bash -c 'RANDOM=640; echo $RANDOM $RANDOM $RANDOM'
28612 27230 24923
$ bash -c 'RANDOM=640; echo $RANDOM $RANDOM $RANDOM'
28612 27230 24923
$ bash -c 'RANDOM=640; echo $RANDOM $RANDOM $RANDOM'
28612 27230 24923
$
Обратите внимание, что используются одинарные кавычки; двойные кавычки запускают правила интерполяции оболочки:
$ bash -c 'RANDOM=42; echo $RANDOM $RANDOM $RANDOM'
19081 17033 15269
$ RANDOM=42
$ bash -c "RANDOM=640; echo $RANDOM"
19081
$ bash -c "RANDOM=640; echo $RANDOM"
17033
$ bash -c "RANDOM=640; echo $RANDOM"
15269
$
потому $RANDOM
что интерполируется родительской оболочкой до bash -c ...
запуска дочернего процесса. Либо используйте одинарные кавычки, чтобы отключить интерполяцию (как показано выше), либо иным образом предотвратите интерполяцию:
$ RANDOM=42
$ SEED_FOR_MY_GAME=640
$ bash -c "RANDOM=$SEED_FOR_MY_GAME; echo \$RANDOM"
28612
$ bash -c "RANDOM=$SEED_FOR_MY_GAME; echo \$RANDOM"
28612
$
Эта особенность RANDOM
упоминается в bash(1)
руководстве
RANDOM Each time this parameter is referenced, a random integer between
0 and 32767 is generated. The sequence of random numbers may be
initialized by assigning a value to RANDOM. If RANDOM is unset,
it loses its special properties, even if it is subsequently
reset.
random=$(bash -c "RANDOM=640; echo $RANDOM")
разве он не должен возвращаться одинаково каждый раз? Или потому что$(bash ...
не рассматривается как новый экземпляр bash?set -x; FOO=42; bash -c "FOO=999; echo $FOO"
. Двойные кавычки позволяют заменить$RANDOM
внешнюю оболочку случайной; внутренняя оболочка bash просто повторяет целое число.random=$(bash -c "RANDOM=$mac; echo $RANDOM")
bash -c 'RANDOM=42; echo "$RANDOM" "$RANDOM" "$RANDOM"'
.