Como posso obter alguns números aleatórios em um determinado intervalo?

0

Eu quero criar um script que crie números aleatórios de 0 a 30.000 e salve-os em um arquivo de texto.

Eu quero que todos os números estejam em uma linha. Eu também quero que os números sejam de 1 a 1.000.000 (quero dizer, deve haver de 1 a 1.000.000 de números no arquivo).

Como faço isso? Eu quero esse script para testar um programa que eu fiz, e eu quero um script para criar automaticamente números, então eu não preciso ter tempo para escrevê-los por conta própria.

Eu também não sei nada sobre scripts do Linux, então se você puder adicionar alguns comentários em seu código, eu ficaria feliz em aceitá-lo! :)

    
por Nikos KLon 30.10.2014 / 22:24

3 respostas

2

Use o comando shuf :

shuf -e {1..N} | tr '\n' ' ' > some-file

Por exemplo:

$ shuf -e {1..10} | tr '\n' ' '
4 9 1 7 8 6 3 5 10 2

Para números muito grandes, talvez você queira usar um loop for e depois misturá-lo:

for i in {1..1000000}
do 
    echo $i
done |
shuf | tr '\n' ' ' > some-file
    
por muru 30.10.2014 / 22:36
2
#!/usr/bin/env python
# The line above should always be on the top of
# an executable python file. It describes the 
# program this file should be interpreted with

# Import let's you extend the core functunality
# of python with code in extra "modules"
import random

# result is a string variable. Python is not strict
# about variable declaration or typing. They can
# be declared like this at any point in the programm 
# and may hold a variaty of data types. This one holds
# text now.
result = ""

# The imported module random offers the function randint.
# This function generates a number, where: 1 <= n <= 1000000
loop_iterations = random.randint(1,1000000)

# counter starts of at zero, counts up and, 
# on the last round, reaches loop_iterations -1
for counter in range(loop_iterations):
    new_random_integer = random.randint(0,30000)
    result += ", "
    # We can't add a number to a string, so we need
    # to convert it into a text representation first.
    result += str(new_random_integer)

# A file handler let's you interact with an opened file.
# open takes a path and a setting wether you want to 
# read/write. w means write.
file_handler = open('/tmp/output.txt', 'w')
file_handler.write(result)
file_handler.close()
    
por Bernd 30.10.2014 / 22:56
1

Uma técnica muito frequente para gerar números aleatórios dentro do intervalo específico é tomar um inteiro aleatório e calcular o resto da divisão entre o número inteiro e a diferença dos limites do intervalo. A ideia básica é que o restante só pode ser de 0 para divisor, então obtemos isso e então compensamos o valor resultante pelo limite baixo. Eu usei essa técnica várias vezes ao escrever código em C.

Naturalmente, essa questão é marcada com scripts e é possível implementar a mesma técnica em bash . Podemos usar o gerador da variável $RANDOM e, em seguida, obter o inteiro no intervalo desejado usando a calculadora bc . O script abaixo faz exatamente isso:

#!/usr/bin/env bash

get_random_int(){

    echo "$low + $RANDOM % ( $high - $low + 1  )" | bc
}

main(){
    local howmany=$1
    local low=$2
    local high=$3

    local counter=0    
    while [ $counter -lt $howmany  ]
    do
        get_random_int
        counter=$(($counter+1))
    done
}

main "$@"

Uso básico:

$ ./random_in_range.sh 3 100 200                                                                                                      
184
110
179

O primeiro argumento é quantos inteiros você quer, o segundo é o limite baixo, e o terceiro argumento é o limite superior.

    
por Sergiy Kolodyazhnyy 31.12.2016 / 02:07