2016-08-24 163 views
1

考慮下面的shell腳本,後面的輸出時RANDOM`不是由種子確定...殼牌`和`awk`

#!/bin/bash 

RANDOM=5 

for i in {0..9..1} 
do 
     rand_val=$(awk -v rand_awk=$RANDOM 'BEGIN{print rand_awk;}') 
     echo "generated $RANDOM" 
     echo "generated in awk: $rand_val" 
done 

首先運行:

generated 18499 
generated in awk: 9147 
generated 9909 
generated in awk: 20212 
generated 24640 
generated in awk: 24874 
generated 15572 
generated in awk: 2499 
generated 5516 
generated in awk: 10235 
generated 17897 
generated in awk: 8039 
generated 19000 
generated in awk: 26744 
generated 12793 
generated in awk: 2500 
generated 27730 
generated in awk: 20895 
generated 5509 
generated in awk: 887 

二運行:

generated 18499 
generated in awk: 16728 
generated 9909 
generated in awk: 31548 
generated 24640 
generated in awk: 11705 
generated 15572 
generated in awk: 10184 
generated 5516 
generated in awk: 6024 
generated 17897 
generated in awk: 838 
generated 19000 
generated in awk: 20789 
generated 12793 
generated in awk: 3646 
generated 27730 
generated in awk: 21647 
generated 5509 
generated in awk: 18333 

第三輪:

generated 18499 
generated in awk: 6725 
generated 9909 
generated in awk: 9301 
generated 24640 
generated in awk: 24364 
generated 15572 
generated in awk: 19016 
generated 5516 
generated in awk: 21737 
generated 17897 
generated in awk: 9027 
generated 19000 
generated in awk: 17942 
generated 12793 
generated in awk: 19478 
generated 27730 
generated in awk: 9555 
generated 5509 
generated in awk: 31563 

看起來像在awk聲明中,由RANDOM生成的數字不受種子(5)的影響。 我想rand_val也由RANDOM得到,主要是因爲我想在可預見的方式使用awkrand()功能的種子進行:

#!/bin/bash 

RANDOM=5 
RANGE=3 

for i in {0..9..1} 
do 
     rand_val=$(awk -v rand_awk=$RANDOM -v range=$RANGE 'BEGIN{srand(rand_awk); print rand()*range;}') 
     echo "generated in awk: $rand_val" 
done 
+0

您使用的是什麼版本的awk? gnu awk 4.1.3這裏每次都會產生相同的序列,而srand()也會可靠地改變它。不要指望bash和awk生成相同的數字,即使它們具有相同的種子。他們不使用相同的隨機生成器。 –

+0

@MarcB如何檢查我的awk版本? –

+0

非常類似於任何其他基於Unix的util。 'awk -v'。 –

回答

2

我懷疑它是$(...)創建一個子shell和RANDOM事實是一個特殊的變量。一個微小的變化得到你的第一個腳本始終如一地迴應:

#!/bin/bash 

RANDOM=5 

for i in {0..9..1} 
do 
     R=$RANDOM 
     rand_val=$(RANDOM=$R awk -v rand_awk=$R 'BEGIN{print rand_awk;}') 
     echo "generated $RANDOM" 
     echo "generated in awk: $rand_val" 
done 

我只是重新分配$ RANDOM另一個變量,並通過在代替。

+0

太好了。這就是我一直在尋找... 奇怪...爲什麼subshel​​l產生不可預測的序列? –

+0

正如我所說,我認爲'RANDOM'是一個特殊的變量。在這種情況下,我認爲它被重置在每個shell調用的頂部,可能出於安全目的。總的來說,我認爲這很有意義,即使你對此感到驚訝。 – Tanktalus

+0

就是這樣。你可以在[Bash參考手冊→Bash變量](https://www.gnu.org/software/bash/manual/bashref.html#Bash-Variables)中找到它。 – fedorqui