[ALGO] Comment marche une fonction random() ?

Comment marche une fonction random() ? [ALGO] - Programmation

Marsh Posté le 21-05-2001 à 14:50:34    

Juste par curiosité, je cherche a savoir comment ça marche.
Bon j'ai commencé des recherches, et apparement le plus souvent se sont des suites mathematiques qui sont utilisées.
Mais moi ce que je me demande c'est; comment fait on pour faire varier le nombre ?
alors j'ai une reponse, mais je suis pas sur;
la fonction stocke dans un fichier un entier, s'en sert pour acceder a l'element de la suite, puis l'incremente, et le reecris dans le fichier.
C comme ça que ça marche ?

Reply

Marsh Posté le 21-05-2001 à 14:50:34   

Reply

Marsh Posté le 21-05-2001 à 14:54:03    

Non, c'est une variable statique je pense...

Reply

Marsh Posté le 21-05-2001 à 15:07:29    

bin ouais,mais ta variable si elle est statique, le prog ira toujours chercher la valuer au rang i.
Donc yaura pas de random ....

Reply

Marsh Posté le 21-05-2001 à 15:14:41    

Tu as une variable static seed, qui prend la valeur que tu veux à l'origine. Le srand() sert à lui donner une valeur.
 
Ensuite, le random contient grosso modo :

Code :
  1. nombre random () {
  2.   nombre newSeed = next (seed);
  3.   seed = newSeed;
  4.   return newSeed;
  5. }


Le contenu de next, c'est l'horreur. Tu lui donne un nombre, il
t'en sortira un autre. Le problème étant de faire une fonction qui soit réellement pseudo-aléatoire.
 
Je l'avais vu une fois, j'y ai rien compris :D

 

[edit]--Message édité par kadreg--[/edit]


---------------
brisez les rêves des gens, il en restera toujours quelque chose...  -- laissez moi troller sur discu !
Reply

Marsh Posté le 21-05-2001 à 15:18:06    

ouais, c bien ce que je pensais; l'algo est assez complexe....
j'essaye d'en savoir plus !

Reply

Marsh Posté le 21-05-2001 à 17:28:06    

Bon j'ai du nouveau: alors apparement;
une suite mathematique est definie. Le plus souvent,cette suite se sert de exponentiel, puis garde tronque le resultat pour obtenir un entier.
Ensuite, pour avoir a chaque fois un nombre different, on accede a l'element i de la suite.
et i est determiné a l'aide du timer !

Reply

Marsh Posté le 21-05-2001 à 17:40:45    

D'ou tu sors ça que l'élément i est determiné par le timer.
 
Traditionnellement, on fait l'initialisation du seed en lui refilant l'heure (srand time ()), mais ensuite, ca n'intervient plus.


---------------
brisez les rêves des gens, il en restera toujours quelque chose...  -- laissez moi troller sur discu !
Reply

Marsh Posté le 21-05-2001 à 18:01:19    

Les fonctions srand() et rand() de stdlib.h sont définies comme suit (pour VC++ 6.0 : Win32 Console Application) :  
 
int x=1;  
 
void srand(int n)  
{  
     x=n;  
}  
 
int rand()  
{  
      x=x*0x343fd+0x269ec3;  
      return((x>>16)&0x7fff);  
}
 
Comme on peut le voir, ce n'est pas trop compliqué.
 
Salutations

Reply

Marsh Posté le 21-05-2001 à 18:07:21    

kadreg, ton seed c mon i ... ton timer ...
tfj57 c sympa, mais là, je comprend vraiment pas pourquoi ça ne renvoie pas le meme nombre a chauqe fois, vu que ya rien qui varie ?

Reply

Marsh Posté le 21-05-2001 à 19:53:26    

On utilise effectivement une suite de type u(n+1) = (a * u(n) + b ) modulo N, N étant généralement 2^32 ou 2^64, c'est-à-dire contraint par le type entier utilisé.
 
Le tout est de trouver des coefficients a et b qui rendent les termes de cette suite apparemment aléatoires.
 
Et effectivement, ces suites de nombres n'ont rien d'alétoire, c'est d'ailleurs pourquoi on qualifie ce type de générateurs de "pseudo-aléatoires". Ce sont les plus simples et les plus efficaces qu'on ait trouvé jusqu'à présent, mais ils ont aussi un certain nombre de limites. En particulier sur le nombre de tirages qu'ils autorisent.
 
Par exemple, avec le générateur pseudo-aléatoire que l'on trouve dans le C ANSI, c'est un générateur 16-bits. Et il ne convient plus à partir de quelques milliers de tirages, car on se retrouve alors à obtenir des motifs de nombres pseudo-aléatoires qui se répètent. Donc plus du tout aléatoires.
 
Il faut alors changer de générateur pseudo-aléatoire, qui a des limites plus éloignées. Par exemple, le générateur drand48 est assez bon.
 
Voir le topic http://forum.hardware.fr/sqlforum/ [...] warefr.inc pour plus de détails.

Reply

Marsh Posté le 21-05-2001 à 19:53:26   

Reply

Marsh Posté le 21-05-2001 à 23:12:00    

le vrai aléatoire n'existe pas en programmation!


---------------
ne rien inscrire en dessous de cette ligne, merci...
Reply

Marsh Posté le 21-05-2001 à 23:49:48    

imhotep03 a écrit a écrit :

le vrai aléatoire n'existe pas en programmation!




exact, pour "simuler le hasard" on utilise différentes formules mathématiques (il en existe des tas) qui sortent des séries de nombres d'APPARENCES alléatoires. Ce n'est pas parfait mais suffisant pour une utilisation courante
 
le problème c'est que forcément on obtient chaque fois exactement la même série aléatoire... pas pratique :)
 
alors le truc c'est de démarrer la suite de nombres avec une valeur qui est chaque fois différente, et là aussi il existe des tas de solutions, le plus souvent cette première valeur est obtenue en faisant un mix avec l'heure et la date du système, mais bon ça peut varier...
 
d'ailleurs concrètement il existe logiquement deux fonctions pour utiliser une suite aléatoire :
 
si je me souvient bien (?) en pascal par exemple c'est
 
randomize -> initialise la valeur de départ, à n'utiliser qu'une fois
random -> calcule le nombre "aléatoire" suivant de la suite mathématique qui a démarrée avec randomize, à utiliser chaque fois que l'on doit obtenir un nouveau nombre "aléatoire"
 
les noms des fonctions peuvent changer suivant les langages mais c'est toujours le mm principe, j'espère avoir résumé un peu l'ensemble, pour les explications des algo là je laisse parler les professionnels moi j'y comprend rien :)

Reply

Marsh Posté le 22-05-2001 à 00:51:58    

imhotep03 a écrit a écrit :

le vrai aléatoire n'existe pas en programmation!




En programmation, non, mais en physique, si. Tant que les générateurs aléatoires seront logiciels, on ne pourra parler que de générateurs pseudo-aléatoire, car il ne seront que chaotiques (i.e. apparemment aléatoires, mais en réalité décrits par des équations mathématiques et parfaitement prévisibles dès lors qu'on connait l'ensemble des conditions initiales).
 
Par contre, rien n'empêche un fabricant de processeur d'inclure un générateur aléatoire dans le silicium de sa puce, et là, il peut l'implémenter par un générateur véritablement aléatoire. En se basant sur la physique (et non une suite mathématique).

 

[edit]--Message édité par BifaceMcLeOD--[/edit]

Reply

Marsh Posté le 22-05-2001 à 01:29:10    

BifaceMcLeOD a écrit a écrit :

 
En programmation, non, mais en physique, si.




oh que non ! si un générateur aléatoire existait en physique cela voudrait dire que l'Univers n'est pas déterministe, et ça on ne sais toujours pas le dire à l'heure actuelle ! ;)
 
mais bon là je chipotte...

Reply

Marsh Posté le 22-05-2001 à 01:49:23    

On sait quand même que certains événements son indécidables à l'échelle microscopique. C'est même le fondement de la physique quantique...

Reply

Marsh Posté le 22-05-2001 à 02:24:52    

indécidable ?
 
 
je sais,
 
 
je suis neuneu


---------------
oui oui
Reply

Marsh Posté le 22-05-2001 à 02:36:46    

On pourrait par exemple développer un générateur aléatoire à partir d'un compteur geiger enregistrant des désintégrations (qui suivent une statistique de Poisson).
La théorie physique nous donne la statistique des désintégrations mais nous interdit de prévoir quand chacune aura lieu (c'est vraiment aléatoire).

Reply

Marsh Posté le 22-05-2001 à 09:08:50    

en général, ce sont des lois normales qui sont utilisées (le rand du C est faite comme ça je crois). Ensuite, on peut utiliser l'horloge du PC pour initialiser la suite de nb aléatiores afin de ne pas resortir la même suite de nombre...

Reply

Marsh Posté le 22-05-2001 à 09:31:28    

ouais, tout ça conforte ce que je disais. Tout le monde a l'air d'accord, donc c cool !
et puis c marrant le debat qui en decoule :)

Reply

Marsh Posté le 23-05-2001 à 12:38:03    

BifaceMcLeOD a écrit a écrit :

On sait quand même que certains événements son indécidables à l'échelle microscopique. C'est même le fondement de la physique quantique...




Eh oui, au temps pour moi ! merci pour l'info, ça m'évitera de me ridiculiser une autre fois :)
 
effectivement, en mécanique quantique (pas encore prouvée mais bon...) une "particule" pourrait dans certaines conditions allez aussi bien vers la droite que la gauche, pour parler simplement une même cause n'a pas toujours le même effet
 
un véritable générateur aléatoire est donc tout à fait possible (théoriquement) en physique !
 
enfin pour l'instant faut avouer qu'on nage encore "un peu" dans ce domaine !

Reply

Marsh Posté le 23-05-2001 à 13:24:27    

---> théorème d'incomplétude de Gödel :D
 
Et j'insiste, l'aléatoire programmé n'existe pas!!!
Sinon ce n'est plus de l'aléatoire, puisqu'il suit une loi / formule mathématique ou autre...


---------------
ne rien inscrire en dessous de cette ligne, merci...
Reply

Marsh Posté le 24-05-2001 à 11:01:21    

moi je remarque juste que windows plante encore de maniere non deterministe :)
 
 
LEGREG

Reply

Marsh Posté le 24-05-2001 à 11:25:44    

En physique l'aléatoire existe : prenez n'importe quel radionuclide avec une durée de demi-vie. La demi-vie est la durée pour laquelle, le radionuclide à 1/2 chance de se désintégrer
 
Si on prend par exemple un isotope de Radium avec une durée de vie de 15E9 d'année (ça existe), il peut très bien se désintégrer au bout d'une seconde. Ca suit une loi poissonienne.


---------------
Pipiru piru piru pipiru pi
Reply

Marsh Posté le 24-05-2001 à 14:38:13    

Pour ceux qui seraient intéressés par les différents algos de pseudo-random : http://www.alrj.org/docs/algo/random.php

Reply

Marsh Posté le    

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed