固有番号の生成 RANDOM 関数 OS X

固有番号の生成 RANDOM 関数 OS X

数値配列のリストに基づいてランダムジェネレータを作成しています。しかし、乱数を再利用できないように一意にしたいと思います。私「使用済み」現在ランダムに生成された数値を保存し、別の乱数を生成してループを繰り返す配列のリスト「使用済み」配列リストを作成し、すでに使用されていることを確認してください。存在する場合は、未使用の番号があるまで生成し続けます。

これが私が今まで持っているものです。

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

おすすめ記事