数値配列のリストに基づいてランダムジェネレータを作成しています。しかし、乱数を再利用できないように一意にしたいと思います。私「使用済み」現在ランダムに生成された数値を保存し、別の乱数を生成してループを繰り返す配列のリスト「使用済み」配列リストを作成し、すでに使用されていることを確認してください。存在する場合は、未使用の番号があるまで生成し続けます。
これが私が今まで持っているものです。
generate.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
FreeBSDにはランダムなソートオプションsort
があります-R
が、OS / Xがソートされていないと驚くでしょう。したがって、次のようにすることができます(配列要素に改行文字が含まれていないと仮定)。
printf '%s\n' "${list[@]}" | sort -R > generated.txt
答え2
2つのタイプミス:
[ $j -eq $RANDOMNUMBER ]
しなければならない[[ $j -eq $RANDNUMBER ]]
修正が効果があるようです。