LINUX.ORG.RU

[shell] $RANDOM внутри $(). WTF??

 


0

0


[386] [neko][0]%echo `echo $RANDOM`
3335
[386] [neko][0]%echo `echo $RANDOM`
3335
[386] [neko][0]%echo `echo $RANDOM`
3335

При этом, обновляется значение в random после второго вызова без ``/$()

[386] [neko][0]%echo $RANDOM
3335
[387] [neko][0]%echo $RANDOM
22823
[387] [neko][0]%echo `echo $RANDOM`
17318
[388] [neko][0]%echo `echo $RANDOM`
17318
Что делать? Кто виноват? Где виноват?

Шелл - zsh.



Последнее исправление: NekoExMachina (всего исправлений: 1)

Чего ради переменная (а это переменная) должна обновляться внутри $()? Насколько я понимаю, окружение $() для того и создано, чтобы изолировать происходящее внутри от основного скрипта.

vaulter
()

This isn't a bug, this is a feature (c) Bill Gates

man zshall:

The values of RANDOM form an intentionally-repeatable pseudo-random sequence; subshells that reference RANDOM will result in identical pseudo-random values unless the value of RANDOM is referenced or seeded in the parent shell in between subshell invocations.


You can fix it by using the following crutch:
echo $RANDOM > /dev/null; echo `echo ${RANDOM}`

nnz ★★★★
()
Ответ на: комментарий от NekoExMachina

Полагаю, не-рандомный рандом — просто следствие того, что создается отдельный экземпляр шелла, наследующий все свойства родителя (включая random seed), но при этом никак на него не влияющий, и авторам было лень делать специальную восходящую связь для рандома.

nnz ★★★★
()
Ответ на: комментарий от nnz

Окей. Если я правильно понимаю, что такое random seed, то он отличается в каждую единицу времени - т.е. при создании каждого отдельного экземпляра shell'а через `` в родительском шелле должен быть уже другой random seed, и следовательно $RANDOM должен принять другое значение.
Либо я ничего не понимаю, либо такое поведение рандома добавляет лишний быдлокод.
В первом случае - киньте ссылкой, куда почитать, пожалуйста.

NekoExMachina
() автор топика
Ответ на: комментарий от NekoExMachina

Просто интересна ситуация, в которой такое поведение шелла будет необходимо =)

Ну, можно под экстрасенса косить ;)

[nnz@christine ~]$ echo `echo $RANDOM; echo $RANDOM`
26295 2619
[nnz@christine ~]$ echo $RANDOM
26295
[nnz@christine ~]$ echo $RANDOM
2619
[nnz@christine ~]$

nnz ★★★★
()
Ответ на: комментарий от NekoExMachina

>Если я правильно понимаю, что такое random seed, то он отличается в каждую единицу времени - т.е. при создании каждого отдельного экземпляра shell'а через `` в родительском шелле должен быть уже другой random seed

Вовсе необязательно.
Традиционно, в прогах инициализация random seed производится довольно редко, обычно один раз в начале работы. При этом в seed записывается некое значение, обычно на базе показаний системного таймера. После этого, каждый вызов функции random(), помимо возврата рандомного значения, обновляет seed, и поэтому в следующий раз значение будет уже другое. Т.е. по сути речь идет о рекуррентной последовательности, в которой каждый элемент определяется через предыдущие, и только первый элемент берется «с потолка».

Однажды, во времена неразумной молодости, я попытался делать реинициализацию seed'а на каждой итерации некого цикла. Результат оказался плачевным: все рандомные числа оказались одинаковыми. Потому что за время исполнения цикла показания системного таймера не менялись, и seed получался одним и тем же.

Конечно, в параноидальных системах типа gnupg, использующих /dev/random, принципы совсем другие.

Почитать по теме можно Кнута (кажется, второй том).

nnz ★★★★
()
Ответ на: комментарий от NekoExMachina

> Зачем теоретически может понадобиться не-рандомный рандом - не понимаю.

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

annoynimous ★★★★★
()
Ответ на: комментарий от val-amart

Конкретно в данном случае нужен как раз не Шнайер.

Lumi ★★★★★
()

Шелл - zsh.

В bash такой проблемы нет.

GotF ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.