生成唯一数字 RANDOM 函数 OS X

生成唯一数字 RANDOM 函数 OS X

我正在根据数字数组列表创建一个随机生成器。但是,我希望它是唯一的,以便随机数不能再次使用。我尝试过创建一个'用过的'数组列表,它将存储当前随机生成的数字,然后生成另一个随机数字,然后循环遍历'用过的'数组列表并检查它是否已被使用。如果有则继续生成,直到有未使用的数字。

这是我到目前为止所拥有的。

生成.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 ]]

修正后似乎有效。

相关内容