Contenu | Rechercher | Menus

Annonce

Si vous avez des soucis pour rester connecté, déconnectez-vous puis reconnectez-vous depuis ce lien en cochant la case
Me connecter automatiquement lors de mes prochaines visites.

À propos de l'équipe du forum.

#1 Le 23/05/2014, à 00:29

Sun12

Génération d'un nombre aléatoire sans répétition

svp j'ai besoin d'aide urgent
je travaille en sh
et j'ai besoin de générer un nombre aléatoire sans répétition..
voilà ce que j'ai fait..

mais ça n'a pas abouti

#!/bin/sh

touch aleatoire1
n=`shuf -i 1-5 -n1`
"$n" >> aleatoire1
while grep "$n" aleatoire1 # aleatoire le fichier lli fih les nombre
    do
    n=`shuf -i 1-5 -n1`
"$n" >> aleatoire1
done
echo "$n"
le terminal se bloque

des suggestions svp?????

Hors ligne

#2 Le 23/05/2014, à 02:23

Compte supprimé

Re : Génération d'un nombre aléatoire sans répétition

Bonjour,

↙↙↙↙↙↘↘↘↘↘

#!/bin/bash
# alea.sh

var=$1
if ! [ "`echo $var | grep "^[ [:digit:] ]*$"`" ] # Contrôle de saisie de l'argument numéro 1 → que des caractères numériques !
then
    var=10 # En cas d'erreur de saisie, ou en l'abscence d'argument, var = 10.
fi

touch aleatoire1
for (( i=0; i<$var; i++ )) # Ne fonctionne pas avec !/bin/sh → Remplacement de !/bin/sh par !/bin/bash.
    do
        echo `shuf -i 1-5 -n1` >> aleatoire1
    done
cat aleatoire1

↖↖↖↖↖↗↗↗↗↗

Voilà.

Pour info :

--

 while grep "$n" aleatoire1 # aleatoire le fichier lli fih les nombre 

→ Boucle infinie... sad

--

n=`shuf -i 1-5 -n1`
echo "$n" >> aleatoire1

→ Plus court :

echo `shuf -i 1-5 -n1` >> aleatoire1

Dernière modification par Cirius1987 (Le 23/05/2014, à 21:33)

#3 Le 24/05/2014, à 23:33

Sun12

Re : Génération d'un nombre aléatoire sans répétition

Cirius1987

ah oui vs avez raison c'est une boucle infinie..moi j'ai voulu dire par ce test tant que je peux lire la ligne qui a un numéro aléatoire..

Merci ..svp est ce que je peux vs contacter en privé.? merci

Hors ligne

#4 Le 25/05/2014, à 00:32

Compte supprimé

Re : Génération d'un nombre aléatoire sans répétition

Sun12 a écrit :

ah oui vs avez raison c'est une boucle infinie..moi j'ai voulu dire par ce test tant que je peux lire la ligne qui a un numéro aléatoire..

Oui je comprend, mais, si on suit votre logique, un tel test n'échouera que lorsque il n'y aura plus de place pour rajouter une ligne au fichier "aleatoire1" (disque dur saturé)... . Plutôt que d'en arriver là, il serait plus sage de considérer que c'est une boucle infinie smile .
De plus, while grep "$n" aleatoire1 n'aurai pas eu cet effet.
Imaginez, le programme génère le chiffre 3, puis, plusieurs essais après, génère encore le chiffre 3 → pourquoi grep serait déterminant dans le test puisque la présence d'un seul des chiffres 3 est instamment suffisante à la réussite du test ?

Sun12 a écrit :

svp est ce que je peux vs contacter en privé.? merci

Bien sûr.

Dernière modification par Cirius1987 (Le 25/05/2014, à 01:25)

#5 Le 25/05/2014, à 05:00

pingouinux

Re : Génération d'un nombre aléatoire sans répétition

Bonjour,
Pour générer une suite de nombres aléatoires compris entre 1 et 5 sans répétition, je ferais simplement ceci :

shuf -i 1-5

À moins que je n'aie pas compris la question…

Hors ligne

#6 Le 25/05/2014, à 10:35

Compte supprimé

Re : Génération d'un nombre aléatoire sans répétition

pingouinux a écrit :

Bonjour,
Pour générer une suite de nombres aléatoires compris entre 1 et 5 sans répétition, je ferais simplement ceci :

shuf -i 1-5

À moins que je n'aie pas compris la question…

"sans répétitions" semblait ambiguë vu son code, apparemment le résultat semble le satisfaire. Après, il est clair que si on veut faire un évènement où on limite le nombre d'échantillon au nombre de possibilité, un programme comme ça est suffisant :

↙↙↙↙↙↘↘↘↘↘

#!/bin/bash
# alea.sh

touch aleatoire1
echo `shuf -i 1-5` >> aleatoire1
cat aleatoire1

↖↖↖↖↖↗↗↗↗↗

Dernière modification par Cirius1987 (Le 25/05/2014, à 14:55)

#7 Le 25/05/2014, à 13:26

pingouinux

Re : Génération d'un nombre aléatoire sans répétition

@Cirius1987 #6 :

Pour info, cela est équivalent (le touch est inutile)
- pour créer le fichier

shuf -i 1-5 >aleatoire1

- pour prolonger le fichier

shuf -i 1-5 >>aleatoire1

Hors ligne

#8 Le 25/05/2014, à 14:32

Compte supprimé

Re : Génération d'un nombre aléatoire sans répétition

pingouinux a écrit :

le touch est inutile

Tu as parfaitement raison Pingouinux, mais dans la logique du while grep "$n" aleatoire1 de Sun12 il est préférable qu'il conserve le touch afin de mettre à jour l'horodatage. Cela lui permettrait de comparer la taille du fichier aleatoire1 entre deux moments afin de voir si, et/ou comment, ça évolue au fur et à mesure du temps d'exécution.
Après je ne connais pas ses besoins, mais je n'ai pas estimé qu'il soit débutant au point de mettre le touch pour rien dans son propre code puisqu'il sait apparemment se servir des flux.

-----

pingouinux a écrit :

- pour créer le fichier

shuf -i 1-5 > aleatoire1

- pour prolonger le fichier

shuf -i 1-5 >> aleatoire1

- Pour créer et/ou remplacer

shuf -i 1-5 > aleatoire1

- Pour créer et/ou prolonger

shuf -i 1-5 >> aleatoire1

→ On utilise que la deuxième, y compris pour la création, tant qu'il n'y a pas l'intention d'effacer le fichier aleatoire1 à chaque démarrage du script smile .

Après, bien évidemment, d'autres méthodes sont possibles, mais on peut penser qu'il y a un intérêt plus grand que celui de simplement générer une suite de chiffre aléatoire (sinon, par exemple, quel intérêt d'y stocker dans un fichier ?).

Dernière modification par Cirius1987 (Le 29/05/2014, à 18:08)