Баш случайно с семенами?

8

Я использовал $((1 + RANDOM % 1000))для генерации случайного числа.

Можно ли сделать что-то подобное, но обеспечить семя?

Чтобы при одинаковом начальном числе всегда выводилось одно и то же случайное число?

Филип Киркбрайд
источник

Ответы:

14

Присвойте начальное значение 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.
thrig
источник
Если я бегу, random=$(bash -c "RANDOM=640; echo $RANDOM")разве он не должен возвращаться одинаково каждый раз? Или потому что $(bash ...не рассматривается как новый экземпляр bash?
Филипп Киркбрайд
1
двойные кавычки, вероятно, не то, что вы хотите там
Thrig
1
Посмотрите, что произойдет, если вы делаете set -x; FOO=42; bash -c "FOO=999; echo $FOO". Двойные кавычки позволяют заменить $RANDOMвнешнюю оболочку случайной; внутренняя оболочка bash просто повторяет целое число.
Джефф Шаллер
@ thrig мне нужны двойные кавычки, потому что в моем случае это на самом делеrandom=$(bash -c "RANDOM=$mac; echo $RANDOM")
Филипп Киркбрайд
Конечно должно быть bash -c 'RANDOM=42; echo "$RANDOM" "$RANDOM" "$RANDOM"'.
G-Man говорит: «Восстанови Монику»