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

10 réponses

1 2
Avatar
Stephane Chazelas
Rakotomandimby wrote in message
news:c1cu8m$3u5$
J'ai découvert grace a vous (ici ) la variable $RANDOM pour generer un
entier aleatoire .

Pourriez vous m'aiclerer sur son fonctionnement ?


Elle renvoie a chaque fois qu'elle est expandee un nombre entre 0 et
32767.

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 ))


pas tout a fait. Premierement, les nombres entre 0 et 2767 auront une
plus grande probabilite' d'apparaitre que ceux entre 2768 et 4999.
Ensuite avec les pseudo-generateurs, les bits de poids faible ont
souvent une sequence moins random que les bits de poids fort (comparer
RANDOM % 2 et RANDOM/16384 sous bash par exemple).

Avec zsh, tu as un module de maths avec des fonctions qui te donnent des
nombres flottants entre 0 et 1.

Sinon: $(( $RANDOM * 5000 / 32768 ))

--
Stephane ["stephane.chazelas" @ "free.fr"]

Avatar
Stephane Chazelas
Stephane Chazelas wrote in message
news:403b2a13$0$2451$
[...]
print $(( NB % 5000 ))


pas tout a fait. Premierement, les nombres entre 0 et 2767 auront une
plus grande probabilite' d'apparaitre que ceux entre 2768 et 4999.
[...]

Sinon: $(( $RANDOM * 5000 / 32768 ))


Well, la distribution n'est pas uniforme non plus, dans ce cas, et il ne
peut pas en etre autrement vu que 32768 n'est pas mutiple de 5000, yen
aura toujours au mieux 2768 qui n'auront pas la meme probabilite que les
autres. C'est plus criant avec $(( $RANDOM * 32767 / 32768 )) (0 a une
probabilite' de 2/32768 alors que les autres ont une probabilite' de
1/32768)

while R=$RANDOM; (( $R >= 30000 )); do :; done
print "$(( $R / 6 ))"

(note que $RANDOM n'est ni Bourne, ni POSIX).

--
Stephane ["stephane.chazelas" @ "free.fr"]


Avatar
Rakotomandimby
Stephane Chazelas wrote:

(note que $RANDOM n'est ni Bourne, ni POSIX).


quelle alternative ai-je en restant dans le domain des script shell ?

on peut toujours générer ça avec un tres simple code en C mais bon . Pour
faire "shell rulez" ... :-)

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

Avatar
JustMe
Rakotomandimby wrote:

Stephane Chazelas wrote:


(note que $RANDOM n'est ni Bourne, ni POSIX).



quelle alternative ai-je en restant dans le domain des script shell ?

on peut toujours générer ça avec un tres simple code en C mais bon . Pour
faire "shell rulez" ... :-)



Je ne pense pas que ce soit possible avec $RANDOM car 5000 n'est pas un
diviseur de 32768

Il faudrait trouver un autre générateur aleatoire.


Sur mon cygwin, il y a une commande "gsl-randist" qui fait ce que tu
veux. Mais elle n'est pas installée en standard sous linux. Ca rebvient
donc a faire du code C

Mais rien n'empeche de faire un shell qui genere du C et qui le compile :-)


Avatar
Stephane Chazelas
Rakotomandimby wrote in message
news:c1fcdg$hbf$
Stephane Chazelas wrote:

(note que $RANDOM n'est ni Bourne, ni POSIX).


quelle alternative ai-je en restant dans le domain des script shell ?


rand() dans awk (/usr/xpg4/bin/awk ou nawk sous Solaris).

ou faire la pseudo generation a la main. Par exemple, le RANDOM de bash,
c'est :

rseed=0 last_rand=0
rand() {
while
rseed=$(($rseed * 1103515245 + 12345))
REPLY=$((($rseed >> 16) & 32767))
[ "$REPLY" -eq "$last_rand" ]
do :; done
last_rand=$REPLY
}

pour 2.05b (avec des unsigned int).


Avatar
JustMe
Stephane Chazelas wrote:

Rakotomandimby wrote in message
news:c1fcdg$hbf$

Stephane Chazelas wrote:


(note que $RANDOM n'est ni Bourne, ni POSIX).


quelle alternative ai-je en restant dans le domain des script shell ?



rand() dans awk (/usr/xpg4/bin/awk ou nawk sous Solaris).


je pensais plus a awk. Je vieillis moi ;-)


ou faire la pseudo generation a la main. Par exemple, le RANDOM de bash,
c'est :

rseed=0 last_rand=0
rand() {
while
rseed=$(($rseed * 1103515245 + 12345))
REPLY=$((($rseed >> 16) & 32767))
[ "$REPLY" -eq "$last_rand" ]
do :; done
last_rand=$REPLY
}

pour 2.05b (avec des unsigned int).






Avatar
Rakotomandimby
JustMe wrote:

Mais rien n'empeche de faire un shell qui genere du C et qui le compile
:-)


ça c'est ce que j'adore dans UNIX .
Je sais bien que ça peut se faire dans les environement non-UNIX aussi mais
puree, quand j'y pense , ça tue la mort ce genre de pratiques( generation
de code C et compilation ) . genre mettre tout ou partie du code en C dans
une variable et tout et tout ... faudra que je teste ...

<humour>
un truc du genre :
#!/bin/zsh
print "#include <...> n #include<...>
int main() {...} " | gcc -option_qui_marche ;
</humour>
--
Rakotomandimby Mihamina Andrianifaharana
Tel : +33 2 38 76 43 65
http://stko.dyndns.info/site_principal/Members/mihamina

Avatar
Rakotomandimby
Stephane Chazelas wrote:

Stephane Chazelas wrote:
rand() dans awk (/usr/xpg4/bin/awk ou nawk sous Solaris).


awk 'BEGIN{srand()}{print rand()}'
awk 'BEGIN{srand()}{print rand(),$0}'

n'affichent rien ( je ne reprends pas la main du shell apres
avoir appelé ça) ...
j'avoue ne pas vraiment comprendre ce que j'ecris mais
n'empeche que ces chose me semble syntaxiquement correctes ...

je me base sur ceci :
http://groups.google.com/groups?hl=en&lr=&ie=UTF-8&threadm=bmmfoi%24sou%241%40news-reader5.wanadoo.fr&rnum=1&prev=/groups%3Fq%3Drandomizer%2Brakotomandimby%2Bgroup:fr.comp.os.unix%26hl%3Den%26lr%3D%26ie%3DUTF-8%26selm%3Dbmmfoi%2524sou%25241%2540news-reader5.wanadoo.fr%26rnum%3D1

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

Avatar
Vincent Bernat
OoO Lors de la soirée naissante du mardi 24 février 2004, vers 17:18,
Rakotomandimby disait:

rand() dans awk (/usr/xpg4/bin/awk ou nawk sous Solaris).


awk 'BEGIN{srand()}{print rand()}'
awk 'BEGIN{srand()}{print rand(),$0}'

n'affichent rien ( je ne reprends pas la main du shell apres
avoir appelé ça) ...
j'avoue ne pas vraiment comprendre ce que j'ecris mais
n'empeche que ces chose me semble syntaxiquement correctes ...


awk va exécuter pour chaque ligne reçue le print rand().
--
BOFH excuse #159:
Stubborn processes


Avatar
Rakotomandimby
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 ....
--
Rakotomandimby Mihamina Andrianifaharana
Tel : +33 2 38 76 43 65
http://stko.dyndns.info/site_principal/Members/mihamina

1 2