CONNEXION
  • RetourJeux
    • Sorties
    • Hit Parade
    • Les + populaires
    • Les + attendus
    • Soluces
    • Tous les Jeux
    • Gaming
  • RetourActu Gaming
    • News
    • Astuces
    • Tests
    • Previews
    • Toute l'actu gaming
  • RetourBons plans
    • Bons plans
    • Bons plans Smartphone
    • Bons plans Hardware
    • Bons plans Image et Son
    • Bons plans Amazon
    • Bons plans Cdiscount
    • Bons plans Decathlon
    • Bons plans Fnac
    • Tous les Bons plans
  • RetourJVTech
    • Actus High-Tech
    • Intelligence Artificielle
    • Smartphones
    • Mobilité urbaine
    • Hardware
    • Image et son
    • Tutoriels
    • Tests produits High-Tech
    • Guides d'achat High-Tech
    • JVTech
  • RetourCulture
    • Actus Culture
    • Culture
  • RetourVidéos
    • A la une
    • Gaming Live
    • Vidéos Tests
    • Vidéos Previews
    • Gameplay
    • Trailers
    • Chroniques
    • Replay Web TV
    • Toutes les vidéos
  • RetourForums
    • Hardware PC
    • PS5
    • Switch 2
    • Xbox Series
    • Switch
    • Pokemon pocket
    • FC 25 Ultimate Team
    • League of Legends
    • Tous les Forums
  • PC
  • PS5
  • Xbox Series
  • Switch 2
  • PS4
  • One
  • Switch
  • iOS
  • Android
  • MMO
  • RPG
  • FPS
En ce moment Genshin Impact Valhalla Breath of the wild Animal Crossing GTA 5 Red dead 2
Liste des sujets

valeur aléatoire

The_stylo
The_stylo
Niveau 6
07 novembre 2005 à 19:24:14

salut, je voulais savoir comment ont peut donner à une nombre A une valeur aléatoire située entre 0 et 6

jejej
jejej
Niveau 9
07 novembre 2005 à 21:24:07

T´as pas d´eu chercher des masses , et en plus tu indiques meme pas le langage utilise ...

enfin , bon , supposons que ce soit du c/c++ :

tu includes l´header <stdlib.h> et le <time.h>

int a = 0;
a = rand()%7;
rand() donne une valeur entre 0 et 32.000 et quelques ... l´operation modulo 7 donne alors un resultat entre 0 et 6 ...

bon , ensuite , pour avoir des valeurs differentes a chaque lancement , tu marques :

srand( time(NULL) );

// bon , je sais que certains diront que modulo , c ´est pas la meilleure methode , mais c´est quand meme la plus simple je pense ... ?

dnob700
dnob700
Niveau 10
07 novembre 2005 à 21:43:06

non seulement c´est la plus simple, mais pour des nombres assez petit (inférieur à 100 disont) le biais est très petit.

Par contre ça ne marche que pour avoir des entiers.

Si tu veux des nombre entre m et M (min et Max) en flottant, tu peut faire :

nombre_alea=((double)rand()/(double)RAND_MAX)*(M-m
)+m;

The_stylo
The_stylo
Niveau 6
07 novembre 2005 à 22:38:51

c´est bon c´est reglé j´aurais du utiliser la fonction :rechercher: avant de poser une question bete

:desole: pour le derangement et :merci: pour l´aide

PS: bah oui j´avais oublié de preciser que c´était du C ^^, j´ai utilisé la methode de jejej, en quoi n´est elle pas la meilleure question:

The_stylo
The_stylo
Niveau 6
07 novembre 2005 à 22:39:54

en plus j´ai loupé mon smiley-> :question:

dnob700
dnob700
Niveau 10
07 novembre 2005 à 23:16:17

c´est du au fait que rand te donne une valeur entre 0 et 32767.

Donc si tu veux par exemple un nombre entre 0 et 10000 et que tu fait :
nombre=rand()%10000;
alors si c´est entre 0 et 30000 il n´y a pas de problème, mais entre 30000 et 32000, tu va obtenir quelque chose entre 0 et 2000.

Donc tu vois que les nombre entre 0 et 2767 vont sortir 1/3 plus souvent que les autres.

Mais bon, si tu veux des nombre plus petit que 100, alors ils ne sortiront même pas 1/300 fois plus souvent.

Dans ton cas, les nombres 0 et 1 sortiront 1 fois de plus tout les 4500 tirages. Ce qui n´est pas énorme si tu ne fait pas un jeu de casino.

Si tu as besoind´un meilleur hasards utilise l´autre méthode.

Mysterouest
Mysterouest
Niveau 10
08 novembre 2005 à 07:04:17

je vais répondre a cette question par le seul language que je connaisse assez par coeur en cas que qqn retrouve ce topic un jour par la fonction recherché

Irc scripting :

$r(1,6) ou $random(1,6)

The_stylo
The_stylo
Niveau 6
08 novembre 2005 à 15:28:28

dnob700 Posté le 07 novembre 2005 à 23:16:17

Dans ton cas, les nombres 0 et 1 sortiront 1 fois de plus tout les 4500 tirages. Ce qui n´est pas énorme si tu ne fait pas un jeu de casino.

Si tu as besoind´un meilleur hasards utilise l´autre méthode.
---------
c´est bon ça me convient parfaitement

godrik
godrik
Niveau 30
08 novembre 2005 à 21:01:42

allez hop, j´en rajoute une...
les LCG sont majoritaire dans les algo de génération d´aléa et ils disposent d´une propriete remarquable qui est de ne pas etre uniformément aléatoire quand on les tire par couple.
(essayez de les tirer par pair et de les afficher en 2D, vous constaterez de joli droite parallele.)
La meilleur solutions dans ce cas reste de tirer de facon aléatoire sur l´ensemble des combinaison.
ainsi si l´on veut tirer 2D6, on en fait pas:
D1 = alea_uniforme (1,6);
D2 = alea_uniforme (1,6);
mais
val = alea_uniforme (1,36/*6*6*/);
D1 = val%6;
D2 = val/6;
deplus, c´est plus rapide dans tous les cas alors pourquoi s´en priver ?

dnob700
dnob700
Niveau 10
08 novembre 2005 à 22:01:51

avec de bonnes valeurs, un LCG peut être tout à fait fiable à ce niveau là et pour cette demande d´exigence (je veux bien que tu me sorte un code source qui va me dessiner des droite paralèlle à partir de valeur aléatoire).

Mais si certain veulent voir le must en matière de générateur de nombre pseudo aléatoire.
Votre bonheur se trouve là :
http://www-cs-faculty.stanford.edu/~knuth/programs/rng.c (pour générer des long)
http://www-cs-faculty.stanford.edu/~knuth/programs/rng-double.c (pour générer des double)

godrik
godrik
Niveau 30
08 novembre 2005 à 23:46:06

voici un bout de code,
j´utilise un LCG poposé par D Knuth sur 8 bits. Il respecte les regles de base des LCG, je ne sais pas trop pour les règles évolué par contre, mais TOUS les LCGs ont cette failles la.
Bien sur la distance entre les droites parallèle est un indice de la qualité du LCG.
Je te laisse gnuplot-er ou excel-er la sorti pour t´en convaincre.

  1. include <stdio.h>

unsigned int seed = 1;
unsigned int a = 137;
unsigned int b = 187;
unsigned int mod = (1 << 8);

unsigned int myrand()
{
seed *= a;
seed += b;
seed %= mod;
return seed;
}

int main ()
{
int i;
for (i=0; i<500; i++)
printf ("%d %d\n", myrand(), myrand());
return 1;
}

godrik
godrik
Niveau 30
09 novembre 2005 à 00:01:02

d´ailleurs si on considere les
myrand()%8
on a la suite recurente: 47250361

en utilisant les bit de poids fort, on ne voit pas de suite a l´oeil nu
une nouvelle version:

  1. include <stdio.h>

unsigned int seed = 1;
unsigned int a = 137;
unsigned int b = 187;
unsigned int mod = (1 << 8);

unsigned int myrand()
{
seed *= a;
seed += b;
seed %= mod;
return seed;
}

unsigned int myrandmod(unsigned int m)
{
double toto = myrand();
toto /= mod;
return toto * m;
}

int main ()
{
int i;
double toto;
for (i=0; i<500; i++)
{
unsigned int t = myrandmod(100);
printf ("%d %d\n", t%10, t/10);
// printf ("%d %d\n", myrandmod(10), myrandmod(10));
}

return 1;
}

ici, je normalise mes valeures et je les tire d´un coup, toutes les valeurs apparaissent,
dans la version en commentaire, on constate des trous (PS: rappelons que c´est ici un generateur 8 bits, alors, on ne peut pas s´attendre a des merveilles. Mais ca explicite mes propos)

dnob700
dnob700
Niveau 10
09 novembre 2005 à 18:48:38

bien sur, mais si tes générateurs sont des blagues alors forcément.

essaye avec ces valeurs, là tu aura un véritable LCG :

//Les __int64 sont des entiers sur 64 bits.
__int64 X0=314159;
__int64 a0=89853;
__int64 a1=4756877;
__int64 m=999999999989;

long rng()
{
X0=(((X0*a0)%m)*a1)%m;
return (long)(X0&0x7fffffff);
}

Et là, bien sûr ce n´est pas un générateur 8 bits, mais au moins il n´y a pas de droites parallèles quelque soit le modulo avec lequel tu récupère les valeurs (quelque soit la valeur de a dans "pixel(rng()%a,rng()%a);" si pixel est ta fonction pour allumer des pixels).

bien sur ta méthode pour tirer des valeurs uniforme est valable, mais ce que je veux dire, c´est qu´avec un bon générateur (celui-ci est celui de Maple) on peut largement s´en passer car c´est un biais qui n´apparait pas.

godrik
godrik
Niveau 30
09 novembre 2005 à 20:14:35

je ne peux pas tester, mon compilos ne gere pas les int64 (je vais hacké ca, mais la j´ai plein de truc a faire, je ferai ca a la fin du mois, rappele le moi au cas ou j´oublierai)

mais je t´assure que tous les LCG ont cette propriété, apres, celui ci est peut etre suffisament bien pour que la distance entre les droites parallele soit de 1 et donc, tous les points du plan discretisé [0; 2^64-1]^2 apparaisse.

En outre, la plupart des libs n´implémente pas un LCG sur 64 bits, mais un LCG sur 16 bits qui est bien moins bon (celui de java par exemple n´est pas sans faille).
Apres, je ne dis pas qu´il ne faut pas utiliser les LCGs. J´en utilises moi même au quotidien. Je veux juste attirer l´attention sur le fait que les propriété les générateurs aléatoire reposent sur des loi statistiques et que l´on ne peut pas tout faire avec.

un LCG génère de l´aléa uniformément distribué sur [0; mod-1] et il ne fait rien d´autre.
Il n´assure en outre pas la non-prédiction. (et c´est d´ailleurs cette propriété qui pèche lors du tirage par pacquet).

Sur ce, je met ce générateur dans ma TODO list.

godrik
godrik
Niveau 30
09 novembre 2005 à 20:26:45

PS: je ne suis pas bien conviancu que ce soit un LCG que tu me présente la...
je m´explique:

X0=(((X0*a0)%m)*a1)%m;

bon ok X_{n+1} = X_n*a0*a1%m
ca c´est bien linéaire...

return (long)(X0&0x7fffffff);

Ca j´ai peur que ce ne soit pas tres linéaire par contre...
tu as une décomposition qui te ramene a quelque chsoe de la forme
X_{n+1} = a*X_n + b %m ?

godrik
godrik
Niveau 30
09 novembre 2005 à 20:48:36

In fact, ca a déjà été fait pour moi:
http://crypto.mat.sbg.ac.at/results/karl/server/node5.html
regarde le LCG de maple avec la jolie photo au dessus

dnob700
dnob700
Niveau 10
09 novembre 2005 à 21:33:06

Effectivement, tu as absolument raison, ce n´était pas un LCG. J´avais juste fait ça pour me ramener à des long, sans faire gaffe.

Mais en le supprimant (le AND), je ne retrouve tout de même pas ce qui est annoncé sur ton site.

bon, je testerais ça un peu plus si j´ai du temps.

godrik
godrik
Niveau 30
09 novembre 2005 à 21:42:48

une autre technique pour te convaincre consiste a tirer n couples (x, y) n >> mod^2 et a compterle nombre d´occurence de chaque valeur puis a comparer la distribution avec une distribution aléatoire (test du chi-deux ou kolmororov-smirnoff).
Je penses (sans être sur) que tu rejettra ainsi l´hypothese d´uniformité de la distribution des couples (x,y).

godrik
godrik
Niveau 30
20 novembre 2005 à 22:34:40

pour conclure ce que l´on dit, j´ai rédigé un petit article sur les LCGs et la génération d´aléa:
http://www.mandragor.org/article.php?id=12

Si j´ai oublié des choses, fais des erreurs, vous pensez que je devrait parler d´autre choses... n´hesitez pas!

Deplus, cet article peut faire une bonne réponses aux erreurs standards sur l´aléa et aux demande d´explication.

Sous forums
  • Aide à l'achat Mac
  • Macintosh
  • Création de Jeux
  • Programmation
  • Création de sites web
  • Linux
  • Internet
  • Steam Deck
  • Hardware
La vidéo du moment