PHP或shell:如何在没有背对背重复的情况下随机化列表?

时间:2013-05-10 07:42:59

标签: php bash random

我在Linux BASH shell中写过这个,但如果在PHP中有一个更好的解决方案就可以了。

我需要从12个元素的数组中生成随机选择。这就是我到目前为止所做的事情:

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

每次调用时,它会随机选择一个元素。但是,它经常“随机”选择连续几次相同的元素。如何在BASH shell或PHP中实现这一点,以便进行随机选择,这也不是最后一个选择的重复?谢谢!

2 个答案:

答案 0 :(得分:2)

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

如果您一次又一次地调用该脚本,那么假设脚本名称为test.sh,您需要将其称为. test.sh而不是./test.sh,它将使脚本运行目前的壳。否则即使export也不需要。否则,创建临时文件方法是另一种获取最后一个值的有效方法。

答案 1 :(得分: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:

source ./next-index.sh

保存脚本是next-index.sh文件。

您也可以在执行之间将$perm保存到文件中。