OVH Cloud OVH Cloud

$RANDOM

18 réponses
Avatar
Rakotomandimby
Bonjour
J'ai découvert grace a vous (ici ) la variable $RANDOM pour generer un
entier aleatoire .

Pourriez vous m'aiclerer sur son fonctionnement ?

En effet , en l'appelant j'ai un souci : elle ne fourni que des nombres
assez grands ( > 5000 ) Moi j'aurai besoin que sans trop d'acion elle me
fournisse un nombre compris entre ( comme par hasard ) 0 et 5000

Est ce que ceci est une bonne solution ?

#!/bin/zsh
(( NB = $RANDOM ))
print $NB
print $(( NB % 5000 ))


Ou bien y a t il mieux ?
Merci .
--
Rakotomandimby Mihamina Andrianifaharana
Tel : +33 2 38 76 43 65
http://stko.dyndns.info/site_principal/Members/mihamina

8 réponses

1 2
Avatar
JustMe
Rakotomandimby wrote:

Vincent Bernat wrote:

awk va exécuter pour chaque ligne reçue le print rand().



effectivement :
(sous zsh)

print toto | awk 'BEGIN{srand()}{print int(rand()*5000)}'

me donne ce que je veux.

le truc c'est que si je lance cette commande plusieurs fois par secondes,
elle me genere le meme nombre ... pourquoi donc ?
au bout de environ une seconde le nombre obtenu change et c'est le meme
nombre pendant environ une seconde et ainsi de suite ....


Il faut mettre un argument a srand (seed). Par exemple la date cen
seconde puis 1970 ou le PID courant ou la somme des 2. Etc...


Avatar
Stephane Chazelas
Rakotomandimby wrote in message
news:c1g01q$lt4$
[...]
print toto | awk 'BEGIN{srand()}{print int(rand()*5000)}'

me donne ce que je veux.


awk 'BEGIN{srand(); print int(rand()*5000)}'

le truc c'est que si je lance cette commande plusieurs fois par secondes,
elle me genere le meme nombre ... pourquoi donc ?


Parce que la seed est initialisee avec le UNIX time. D'ailleurs

awk 'BEGIN{print srand()}'

est un moyen d'obtenir ce nombre de secondes depuis 1970-1-1.

Si tu veux une valeur differente a chaque fois, il faut que tu initialises
la seed a la main. Genre:

rand() {
eval "$(awk -v seed="$seed" -v "n=${1-32768}" 'BEGIN {
r=rand()
printf "seed=%.17g REPLY=%dn", r, int(r * n)
}')"
}

Avatar
Stephane Chazelas
Stephane Chazelas wrote in message
news:403b8c60$0$22382$
[...]
rand() {
eval "$(awk -v seed="$seed" -v "n=${1-32768}" 'BEGIN {
r=rand()
printf "seed=%.17g REPLY=%dn", r, int(r * n)
}')"
}


Oups.

rand() {
eval "$(awk -v seed="$seed" -v "n=${1-32768}" 'BEGIN {
srand(seed)
r=rand()
printf "seed=%.17g REPLY=%dn", r, int(r * n)
}')"
}

Le mieux etant de faire tout le script en awk ou en perl, il n'y aura pas de
probleme alors.

Avatar
Rakotomandimby
Rakotomandimby wrote:
print toto | awk 'BEGIN{srand()}{print int(rand()*5000)}'


Marche.

Maintenant si je veux pas 5000 exactement mais un truc contenu
dans une variable voici ce que je fait et les erreurs affichées :
============================================================================= [] LINES# ; print toto | awk 'BEGIN{srand()}{print int(rand()* ${LINES} )}'
awk: cmd. line:1: BEGIN{srand()}{print int(rand()* ${LINES} )}
awk: cmd. line:1: ^ syntax error
awk: cmd. line:1: fatal: 0 is invalid as number of arguments for int
===============================================================================
et si je fais :
============================================================================ []LINES# ; print toto | awk 'BEGIN{srand()}{print int(rand()* LINES )}'
0
============================================================================
J'ai trouvé la solution :-) comme un grand ( comme vous )

============================================================================ []LINES# ; print $LINES | awk 'BEGIN{srand()}{print int(rand()* $0 )}'
8
============================================================================
Héhé ... c'est optimisable ou c'est deja tres bien comme ça ?

PS: Desolé pour les lignes de + de 80 char ... je recommencerai pas .

--
Rakotomandimby Mihamina Andrianifaharana
Tel : +33 2 38 76 43 65
http://stko.dyndns.info/site_principal/Members/mihamina

Avatar
Stephane Chazelas
Rakotomandimby wrote in message
news:c1hm3v$bem$
Rakotomandimby wrote:
[...]

[]LINES# ; print $LINES | awk 'BEGIN{srand()}{print
int(rand()* $0 )}'

8

=========================================================================== >

Héhé ... c'est optimisable ou c'est deja tres bien comme ça ?


awk -v n="$LINES" 'BEGIN {srand(); print int(rand() * n)}'

ou

awk 'BEGIN {srand(); print int(rand() * ARGV[1]); ARGC=1}'

(pas teste').

Avatar
JustMe
Stephane Chazelas wrote:

Rakotomandimby wrote in message
news:c1hm3v$bem$

Rakotomandimby wrote:


[...]

[]LINES# ; print $LINES | awk 'BEGIN{srand()}{print


int(rand()* $0 )}'

8



=========================================================================== > >
Héhé ... c'est optimisable ou c'est deja tres bien comme ça ?



awk -v n="$LINES" 'BEGIN {srand(); print int(rand() * n)}'


awk "BEGIN {srand(); print int(rand() * $LINES)}"

est + court :-)

Le probleme est que plusieurs appels tres rapprochés (dans la meme
seconde) donneront le meme resultat (meme initialisation de srand)

awk "BEGIN { srand(PROCINFO["pid"]); print int(rand() * $LINES)}"

qui initialisera le generateur aleatoire avec le pid de awk qui change a
chaque appel :-)



J'aime Unix :-))

PS: pas top d'utiliser la variables LINES qui sert a certaines applis
comme nbr de ligne dans le terminal/fenetre :-)


Avatar
Rakotomandimby
JustMe wrote:

J'aime Unix :-))


C'est incroyable hein ? moi aussi :-)
Le genre de chose que je peux faire maintenant est tout simplement
unbelievable .
J'ai des potes fervents defenseurs de Windows mais franchement j'ai aucun
complexe a me faire face a eux ... ils savent comment tripatouiller leur
systeme, mais moi je sais comment tripatouiller le mien :-)
--
Rakotomandimby Mihamina Andrianifaharana
Tel : +33 2 38 76 43 65
http://stko.dyndns.info/site_principal/Members/mihamina

Avatar
Rakotomandimby
Donc grace a nous tous , j'ai ficellé mon travail
Voici la version finale du script que j'ai ecrit avec notre aide .

(Les questions sur la randomization de fichier et sur RANDOM etaient pour ce
truc la )

http://stko.dyndns.info/playlist-2.2

la premiere version opérationnelle etait tres moche mais la voici

http://stko.dyndns.info/playlist-1

Et merci encore.
Moi aussi j'aime UNIX .

--
Rakotomandimby Mihamina Andrianifaharana
Tel : +33 2 38 76 43 65
http://stko.dyndns.info/site_principal/Members/mihamina
1 2