Gerar números exclusivos Função RANDOM OS X

1

Estou criando um gerador aleatório baseado em uma lista de matriz numérica. No entanto, gostaria que fosse exclusivo para que o número aleatório não possa ser usado novamente. Eu tentei criar uma lista de matriz 'USED' que irá armazenar o número gerado aleatoriamente no momento e depois gerar outro aleatório, em seguida, percorrer o 'USADO lista de matriz ' e verifique se ela já foi usada. Se ele continuar gerando até que haja um número que não tenha sido usado.

Aqui está o que eu tenho até agora.

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

Quando executo o script, não há erros, mas não há nada sendo enviado para o arquivo generated.txt , ele está em branco.

Existe alguma coisa que eu esteja sentindo falta? Espero que vocês possam ajudar :) Agradecemos antecipadamente.

    
por Ryan Hawdon 13.01.2016 / 16:13

2 respostas

1

Uma maneira comum de misturar uma lista é percorrer os elementos e trocar com outro elemento aleatoriamente.

#! /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
Dito isto, o FreeBSD sort tem uma opção -R para ordenar aleatoriamente, eu ficaria surpreso se o tipo OS / X não o fizesse, então você deve ser capaz de fazer (supondo que elementos da matriz não contenham caracteres de nova linha):

printf '%s\n' "${list[@]}" | sort -R > generated.txt
    
por 13.01.2016 / 16:36
1

Dois erros de digitação:

[ $j -eq $RANDOMNUMBER ] deve ser [[ $j -eq $RANDNUMBER ]]

Parece funcionar depois de fazer as correções.

    
por 13.01.2016 / 16:38