The following short script prints a random ten-digit binary number:
#!/usr/bin/zsh
point=''
for i in `seq 1 10`
do
echo $RANDOM >/dev/null
point=$point`if [ $RANDOM -gt 16383 ]; then echo 0; else echo 1; fi`
done
echo $point
However, if I remove the apparently useless echo $RANDOM >/dev/null
line, the script always prints either 1111111111
or 0000000000
.
Why?
Subshells (as created by backticks, or their modern replacement $()
) execute in a different context from the parent shell -- meaning that when they exit, all process-local state changes -- including the random number generator's state -- are thrown away.
Reading from $RANDOM
inside the parent shell updates the RNG's state, which is why the echo $RANDOM >/dev/null
has an effect.
That said, don't do that. Do something like this, which has no subshells at all:
point=
for ((i=0; i<10; i++)); do
point+=$(( (RANDOM > 16383) ? 0 : 1 ))
done
If you test this generating more than 10 digits -- try, say, 1000, or 10000 -- you'll also find that it performs far better than the original did.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With