![生成唯一数字 RANDOM 函数 OS X](https://linux22.com/image/81302/%E7%94%9F%E6%88%90%E5%94%AF%E4%B8%80%E6%95%B0%E5%AD%97%20RANDOM%20%E5%87%BD%E6%95%B0%20OS%20X.png)
我正在根据数字数组列表创建一个随机生成器。但是,我希望它是唯一的,以便随机数不能再次使用。我尝试过创建一个'用过的'数组列表,它将存储当前随机生成的数字,然后生成另一个随机数字,然后循环遍历'用过的'数组列表并检查它是否已被使用。如果有则继续生成,直到有未使用的数字。
这是我到目前为止所拥有的。
生成.sh
#!/bin/bash
USED[0]=""
USED[1]=""
USED[2]=""
USED[3]=""
USED[4]=""
USED[5]=""
USED[6]=""
USED[7]=""
USED[8]=""
USED[9]=""
NUMBER[0]="1"
NUMBER[1]="2"
NUMBER[2]="3"
NUMBER[3]="4"
NUMBER[4]="5"
NUMBER[5]="6"
NUMBER[6]="7"
NUMBER[7]="8"
NUMBER[8]="9"
NUMBER[9]="0"
for i in "${NUMBER[@]}"; do
let RANDNUMBER=$RANDOM%10
for j in "${USED[@]}"; do
if [ $j -eq $RANDOMNUMBER ]; then
let RANDNUMBER=$RANDOM%10
else
echo ${NUMBER[$RANDNUMBER]} >> generated.txt
fi
done
done
当我运行脚本时没有错误,但是没有任何内容输出到生成的.txt文件,它是空白的。
我有什么遗漏的吗?我希望你们能帮忙:) 提前致谢。
答案1
打乱列表的一种常见方法是循环遍历元素并交换随机与另一个元素。
#! /bin/bash -
list=(1 2 3 4 5 6 7 8 9 0)
random_list=("${list[@]}")
n=${#random_list[@]}
for ((i = 0; i < n; i++)); do
(( r = RANDOM % n ))
tmp=${random_list[i]}
random_list[i]=${random_list[r]}
random_list[r]=$tmp
done
printf '%s\n' "${random_list[@]}" > generated.txt
话虽如此,FreeBSDsort
有一个-R
随机排序的选项,如果 OS/X 没有排序,我会感到惊讶,所以你应该能够这样做(假设数组元素不包含换行符):
printf '%s\n' "${list[@]}" | sort -R > generated.txt
答案2
两个错别字:
[ $j -eq $RANDOMNUMBER ]
应该[[ $j -eq $RANDNUMBER ]]
修正后似乎有效。