2013-05-10 15 views
2

我在Linux BASH shell中寫過這個,但是如果PHP中有更好的解決方案,那就沒問題了。PHP或shell:如何隨機化列表而無需背對背重複?

我需要從12個元素的數組中產生一個隨機選擇。這是我迄今爲止所做的:

# Display/return my_array that's been randomly selected: 
# Random 0 to 11: 
r=$(($RANDOM % 12)) 
echo ${my_array[$r]} 

每次調用時,它隨機選擇一個元素。但是,它經常會「隨機地」選擇連續的幾個元素。這怎麼可能在BASH shell或PHP中完成,因此做一個隨機選擇,這也不是最後一個選擇的重複?謝謝!

+0

你會再次調用整個腳本?該呼叫是在腳本內再次發生的? – abasu 2013-05-10 09:09:24

+0

這可能有助於進一步優化您的需求。例如,如果您的結果有時是{0,1,0,1},是否會被視爲重複?對於每12個樣本按順序排列,是否需要隨機排列12個不同的值,還是不夠隨機? – phatfingers 2013-05-10 09:43:34

回答

2
r=$last 
while [ "$last" = "$r" ] 
do 
    r=$(($RANDOM % 12)) 
done 
export last=$r 

如果你一次又一次地調用腳本,然後假設腳本名稱爲test.sh你需要調用它像. test.sh,而不是./test.sh,它會在當前shell中運行該腳本。否則即使是export也不需要。否則,創建臨時文件方法是獲取最後一個值的另一種可靠方法。

+0

+1簡單的「再試一次」方法完全適用於這個問題。 – 2013-05-11 09:01:24

2

,這個腳本狀態你可以從它創建

perm=`echo $perm | sed 's/[0-9]\+//'` #remove the first number from $perm 
if [ -z "$perm" ];then    #if perm == ""   
    perm=`shuf -e {0..12}`   #create new permutation 
    #now perm="11 7 0 4 8 12 9 5 10 6 2 1 3" for example 
fi 
echo $perm | cut -d' ' -f1   #show the first number from $perm 

注排列,然後彈出值。它需要存儲執行之間生成的排列。是通過將它們存儲在shell變量$perm中來實現的。由於shell腳本不能修改調用shell環境,您需要執行它itside當前shell:救腳本是next-index.sh文件

source ./next-index.sh 

您也可以將$perm保存到執行文件之間。