2

Это:

woof() {
        /usr/bin/woof -p $(expr $RANDOM % 32768 + 1024) $@
}

Всегда возвращает один и тот же номер для параметра -p на zsh. В bash $(...) оценивается при каждом вызове. Замена $( ... ) на $[ ... ] «исправляет» эту «проблему» в zsh для меня, но в чем заключается проблема или различие, которое вызывает неожиданное поведение (по крайней мере, неожиданное для меня)?

1 ответ1

3

На самом деле $( ) ведет себя так же, но это не ГСЧ.

Кажется, что zsh RNG продвигается только после обращения к значению, но не повторяется при разветвлении. Это означает, что подоболочки будут просто наследовать старое начальное число от родительского, так как любые изменения, происходящие в подоболочке, не влияют на родительский процесс. Использование $[…] не имеет этой проблемы, так как не создает подоболочки.

Согласно справочной странице zshall(1) :

   RANDOM <S>
          A pseudo-random integer from 0 to 32767, newly generated each time
          this  parameter is referenced.  The random number generator can be
          seeded by assigning a numeric value to RANDOM.

          The values of RANDOM form an intentionally-repeatable  pseudo-ran‐
          dom sequence; subshells that reference RANDOM will result in iden‐
          tical pseudo-random values unless the value of  RANDOM  is  refer‐
          enced  or  seeded  in the parent shell in between subshell invoca‐
          tions.

Тестовое задание:

% echo outer=$RANDOM; (echo inner=$RANDOM); (echo inner=$RANDOM);
outer=10246
inner=5606
inner=5606

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .