2016-04-21 78 views
2

我現在用這個rand()調整了很多時間。rand()for for loop在nawk中總是返回相同的值-ksh

我想在數組中添加1000隨機數,這是迄今爲止我所知道的,它在沒有錯誤的情況下工作,但rand在數組傳遞過程中始終分配相同的數字。隨機數的變化,我希望它是從1到999 ...任何想法最新怎麼了?

BTW我在KSH跑......

nawk ' BEGIN{ 
    for (i=0; i<=999; i++) { 
     srand() 
     NUMBERS[i]= int(rand()*(999)) 
     print NUMBERS[i] 
    } 
}' 

附: 不是dublicate,沒有其他相同的問題ksh。

修訂

nawk ' BEGIN{ 
    srand(1) 
    for (i=0; i<=999; i++) { 
     NUMBERS[i]= int(rand()*(999)) 
     XNUMBERS[i]= int(rand()*(999)) 
     print NUMBERS[i] 
     print XNUMBERS[i] 
    } 
}' 

UPDATE_2

所以工作代碼,我是這個

NUMBERS=`nawk ' BEGIN{ 
    srand() 
    for (i=0; i<=999; i++) { 
     printf("%s\n", 100 + int(rand() * (899))); 
    } 
}'` 
NUMBERS 
#echo $NUMBERS 
XNUMBERS=`nawk ' BEGIN{ 
    srand() 
    for (i=0; i<=999; i++) { 
     XNUMBERS[i]= 100 + int(rand() * (899)); 
    } 
    for (i=0; i<=999; i++) { 
     ver=XNUMBERS[i] ""; 
       rev = ""; 
     for (q=length(ver); q!=0; q--) { 
       rev = rev substr(ver, q, 1); 
       } 
     printf("%s\n", XNUMBERS[i] "|" rev); 
    } 
}'` 

我創建了兩種不同的列表,但是RAND()所賜在相同的位置相同的確切數字....我怎麼能讓第二個蘭德給不同不同的數字?????

最後更新

SOOOOO,任何人閱讀和有同樣的問題,解決的辦法就是UE睡眠兩個部分,你調用函數srand之間的1 ....

回答

3

認沽srand()呼叫外部環路。對於相同的種子rand()會產生相同的數字序列。沒有任何參數的srand()使用當前時間戳作爲種子,並且循環可能恰好使用相同的種子值。因此,你會看到相同的號碼。

+0

擰我..那是錯?不能相信它...檢查請更新後的代碼,我把srand從循環中,是否錯誤,如果我加1的值?我用它來說,1是初始值。 – hedgehog

+1

對,時間戳分辨率以秒爲單位,所以只要所有迭代發生在相同的1秒窗口內,循環將在每次迭代中產生相同的值。如果當前時間恰巧在12:00:01到12:00:02之間,或者在循環運行時類似,那麼您會得到2個值。 @hedgehog - 在循環外部移動srand()是正確的事情,但通過使用1的硬編碼種子值,您將否定使用srand()的整個點,即爲rand獲取新的種子值()每次調用腳本時(只要呼叫間隔1秒或更長)。 –

+0

我明白了,但我想我讀到的是你添加到srand的值,所以在這種情況下,我嘗試了1,是隨機數的起始值,所以我看到它就像我說的從隨機數中選擇一個1至999 ...我錯了嗎? – hedgehog