Typiquement, regarde les generateurs pseudo-aleatoires congruents.
Tu verras qu'il ne faut jamais faire % N, mais passer en flottant
et diviser par RAND_MAX, multiplier par N et arrondir...
Là, j'avoue que je ne comprends pas pourquoi ce serait mieux que % N ;
bien au contraire, si je reprends l'exemple avec RAND_MAX et N et
que je joue un peu avec Python (je multiplie par N-1 sinon on se
retrouve avec N alors que l'on veut un nombre dans l'intervalle
[0, N[) :
T'as regarde ce que c'etait qu'un generateur pseudo-aleatoire congruent ?
typiquement c'est un machin sur lequel faire %N va te donner une periode
d'au plus N.
Par exemple, tirer a pile ou face avec un pseudo-aleatoire congruent, a
coup de %2, va te donner au mieux 0 1 0 1 0 1.
En tout cas, c'est impossible de faire confiance a un bete rand()/random()
"portable" si tu veux un pseudo-aleatoire de qualite decente...
Sans doute, mais là on parle d'afficher une photo au hasard dans un jeu,
il faut donc relativiser.
Non. On commence avec l'affichage d'une photo au hasard d'un jeu, et puis
on passe a autre chose. Ou bien quelqu'un va tomber sur ce code et le
repomper pour autre chose.
On parle ici d'un probleme connu et regle depuis des annees. Je vois zero
raison de ne pas faire les choses correctement. C'est pas comme si c'etait
beaucoup plus complique. Le code necessaire existe deja et peut s'utiliser
sans souci (oui ca existe sous licence BSD, donc tu peux en faire ce que
tu veux, meme pour utilisation commerciale)
Typiquement, regarde les generateurs pseudo-aleatoires congruents.
Tu verras qu'il ne faut jamais faire % N, mais passer en flottant
et diviser par RAND_MAX, multiplier par N et arrondir...
Là, j'avoue que je ne comprends pas pourquoi ce serait mieux que % N ;
bien au contraire, si je reprends l'exemple avec RAND_MAX et N et
que je joue un peu avec Python (je multiplie par N-1 sinon on se
retrouve avec N alors que l'on veut un nombre dans l'intervalle
[0, N[) :
T'as regarde ce que c'etait qu'un generateur pseudo-aleatoire congruent ?
typiquement c'est un machin sur lequel faire %N va te donner une periode
d'au plus N.
Par exemple, tirer a pile ou face avec un pseudo-aleatoire congruent, a
coup de %2, va te donner au mieux 0 1 0 1 0 1.
En tout cas, c'est impossible de faire confiance a un bete rand()/random()
"portable" si tu veux un pseudo-aleatoire de qualite decente...
Sans doute, mais là on parle d'afficher une photo au hasard dans un jeu,
il faut donc relativiser.
Non. On commence avec l'affichage d'une photo au hasard d'un jeu, et puis
on passe a autre chose. Ou bien quelqu'un va tomber sur ce code et le
repomper pour autre chose.
On parle ici d'un probleme connu et regle depuis des annees. Je vois zero
raison de ne pas faire les choses correctement. C'est pas comme si c'etait
beaucoup plus complique. Le code necessaire existe deja et peut s'utiliser
sans souci (oui ca existe sous licence BSD, donc tu peux en faire ce que
tu veux, meme pour utilisation commerciale)
Typiquement, regarde les generateurs pseudo-aleatoires congruents.
Tu verras qu'il ne faut jamais faire % N, mais passer en flottant
et diviser par RAND_MAX, multiplier par N et arrondir...
Là, j'avoue que je ne comprends pas pourquoi ce serait mieux que % N ;
bien au contraire, si je reprends l'exemple avec RAND_MAX et N et
que je joue un peu avec Python (je multiplie par N-1 sinon on se
retrouve avec N alors que l'on veut un nombre dans l'intervalle
[0, N[) :
T'as regarde ce que c'etait qu'un generateur pseudo-aleatoire congruent ?
typiquement c'est un machin sur lequel faire %N va te donner une periode
d'au plus N.
Par exemple, tirer a pile ou face avec un pseudo-aleatoire congruent, a
coup de %2, va te donner au mieux 0 1 0 1 0 1.
En tout cas, c'est impossible de faire confiance a un bete rand()/random()
"portable" si tu veux un pseudo-aleatoire de qualite decente...
Sans doute, mais là on parle d'afficher une photo au hasard dans un jeu,
il faut donc relativiser.
Non. On commence avec l'affichage d'une photo au hasard d'un jeu, et puis
on passe a autre chose. Ou bien quelqu'un va tomber sur ce code et le
repomper pour autre chose.
On parle ici d'un probleme connu et regle depuis des annees. Je vois zero
raison de ne pas faire les choses correctement. C'est pas comme si c'etait
beaucoup plus complique. Le code necessaire existe deja et peut s'utiliser
sans souci (oui ca existe sous licence BSD, donc tu peux en faire ce que
tu veux, meme pour utilisation commerciale)
Bonjour,
Le 02/04/2018 à 11:04, Marc Espie a écrit dans le message
<p9srm0$1e24$ :Typiquement, regarde les generateurs pseudo-aleatoires congruents.
Tu verras qu'il ne faut jamais faire % N, mais passer en flottant
et diviser par RAND_MAX, multiplier par N et arrondir...
Là, j'avoue que je ne comprends pas pourquoi ce serait mieux que % N ;
bien au contraire, si je reprends l'exemple avec RAND_MAX et N et
que je joue un peu avec Python (je multiplie par N-1 sinon on se
retrouve avec N alors que l'on veut un nombre dans l'intervalle
[0, N[) :
T'as regarde ce que c'etait qu'un generateur pseudo-aleatoire congruent ?
De ce que j'en comprends, c'est une suite où le prochain élément dépend
du précédent avec la formule X_n+1 = (a * X_n + c) % m ; a, c et m étant
choisi avec précaution.
On a donc dans le meilleur des cas m éléments qui si répètent, dans le
pire des cas X_n+1 == X_n et on se retrouve avec un seul élément...typiquement c'est un machin sur lequel faire %N va te donner une periode
d'au plus N.
Si je comprends bien tu ne parles plus du N de la discussion précédente
mais du m de la formule ci-dessous, c'est bien cela ?
Par exemple, tirer a pile ou face avec un pseudo-aleatoire congruent, a
coup de %2, va te donner au mieux 0 1 0 1 0 1.
En tout cas j'ai regardé le code d'arc4random_uniform dans ta paroisse
et il fait la même chose que ce que j'ai proposé en enlevant le bas de
l'intervalle alors que j'enlevais le haut. Bien sûr il n'utilise pas
random() mais arc4random(). Du coup, je ne comprends toujours pas ta
remarque qu'il ne faut jamais faire % N.
Bonjour,
Le 02/04/2018 à 11:04, Marc Espie a écrit dans le message
<p9srm0$1e24$1@saria.nerim.net> :
Typiquement, regarde les generateurs pseudo-aleatoires congruents.
Tu verras qu'il ne faut jamais faire % N, mais passer en flottant
et diviser par RAND_MAX, multiplier par N et arrondir...
Là, j'avoue que je ne comprends pas pourquoi ce serait mieux que % N ;
bien au contraire, si je reprends l'exemple avec RAND_MAX et N et
que je joue un peu avec Python (je multiplie par N-1 sinon on se
retrouve avec N alors que l'on veut un nombre dans l'intervalle
[0, N[) :
T'as regarde ce que c'etait qu'un generateur pseudo-aleatoire congruent ?
De ce que j'en comprends, c'est une suite où le prochain élément dépend
du précédent avec la formule X_n+1 = (a * X_n + c) % m ; a, c et m étant
choisi avec précaution.
On a donc dans le meilleur des cas m éléments qui si répètent, dans le
pire des cas X_n+1 == X_n et on se retrouve avec un seul élément...
typiquement c'est un machin sur lequel faire %N va te donner une periode
d'au plus N.
Si je comprends bien tu ne parles plus du N de la discussion précédente
mais du m de la formule ci-dessous, c'est bien cela ?
Par exemple, tirer a pile ou face avec un pseudo-aleatoire congruent, a
coup de %2, va te donner au mieux 0 1 0 1 0 1.
En tout cas j'ai regardé le code d'arc4random_uniform dans ta paroisse
et il fait la même chose que ce que j'ai proposé en enlevant le bas de
l'intervalle alors que j'enlevais le haut. Bien sûr il n'utilise pas
random() mais arc4random(). Du coup, je ne comprends toujours pas ta
remarque qu'il ne faut jamais faire % N.
Bonjour,
Le 02/04/2018 à 11:04, Marc Espie a écrit dans le message
<p9srm0$1e24$ :Typiquement, regarde les generateurs pseudo-aleatoires congruents.
Tu verras qu'il ne faut jamais faire % N, mais passer en flottant
et diviser par RAND_MAX, multiplier par N et arrondir...
Là, j'avoue que je ne comprends pas pourquoi ce serait mieux que % N ;
bien au contraire, si je reprends l'exemple avec RAND_MAX et N et
que je joue un peu avec Python (je multiplie par N-1 sinon on se
retrouve avec N alors que l'on veut un nombre dans l'intervalle
[0, N[) :
T'as regarde ce que c'etait qu'un generateur pseudo-aleatoire congruent ?
De ce que j'en comprends, c'est une suite où le prochain élément dépend
du précédent avec la formule X_n+1 = (a * X_n + c) % m ; a, c et m étant
choisi avec précaution.
On a donc dans le meilleur des cas m éléments qui si répètent, dans le
pire des cas X_n+1 == X_n et on se retrouve avec un seul élément...typiquement c'est un machin sur lequel faire %N va te donner une periode
d'au plus N.
Si je comprends bien tu ne parles plus du N de la discussion précédente
mais du m de la formule ci-dessous, c'est bien cela ?
Par exemple, tirer a pile ou face avec un pseudo-aleatoire congruent, a
coup de %2, va te donner au mieux 0 1 0 1 0 1.
En tout cas j'ai regardé le code d'arc4random_uniform dans ta paroisse
et il fait la même chose que ce que j'ai proposé en enlevant le bas de
l'intervalle alors que j'enlevais le haut. Bien sûr il n'utilise pas
random() mais arc4random(). Du coup, je ne comprends toujours pas ta
remarque qu'il ne faut jamais faire % N.
Non, je parle toujours du N de la discussion precedente. Revise ton
arithmetique modulaire.
Par exemple, tirer a pile ou face avec un pseudo-aleatoire congruent, a
coup de %2, va te donner au mieux 0 1 0 1 0 1.
En tout cas j'ai regardé le code d'arc4random_uniform dans ta paroisse
et il fait la même chose que ce que j'ai proposé en enlevant le bas de
l'intervalle alors que j'enlevais le haut. Bien sûr il n'utilise pas
random() mais arc4random(). Du coup, je ne comprends toujours pas ta
remarque qu'il ne faut jamais faire % N.
Ben evidemment qu'arc4random "marche"...
Je dis depuis le debut que tu ne sais pas quel algo est utilise par random().
La qualite des generateurs pseudo-aleatoires traditionnels que ce soit
rand() ou random(), n'est aucunement garantie. Ca peut tres bien etre des
generateurs pseudo-congruents, ou une autre horreur, sur laquelle %N va
merder de facon catastrophique.
Non, je parle toujours du N de la discussion precedente. Revise ton
arithmetique modulaire.
Par exemple, tirer a pile ou face avec un pseudo-aleatoire congruent, a
coup de %2, va te donner au mieux 0 1 0 1 0 1.
En tout cas j'ai regardé le code d'arc4random_uniform dans ta paroisse
et il fait la même chose que ce que j'ai proposé en enlevant le bas de
l'intervalle alors que j'enlevais le haut. Bien sûr il n'utilise pas
random() mais arc4random(). Du coup, je ne comprends toujours pas ta
remarque qu'il ne faut jamais faire % N.
Ben evidemment qu'arc4random "marche"...
Je dis depuis le debut que tu ne sais pas quel algo est utilise par random().
La qualite des generateurs pseudo-aleatoires traditionnels que ce soit
rand() ou random(), n'est aucunement garantie. Ca peut tres bien etre des
generateurs pseudo-congruents, ou une autre horreur, sur laquelle %N va
merder de facon catastrophique.
Non, je parle toujours du N de la discussion precedente. Revise ton
arithmetique modulaire.
Par exemple, tirer a pile ou face avec un pseudo-aleatoire congruent, a
coup de %2, va te donner au mieux 0 1 0 1 0 1.
En tout cas j'ai regardé le code d'arc4random_uniform dans ta paroisse
et il fait la même chose que ce que j'ai proposé en enlevant le bas de
l'intervalle alors que j'enlevais le haut. Bien sûr il n'utilise pas
random() mais arc4random(). Du coup, je ne comprends toujours pas ta
remarque qu'il ne faut jamais faire % N.
Ben evidemment qu'arc4random "marche"...
Je dis depuis le debut que tu ne sais pas quel algo est utilise par random().
La qualite des generateurs pseudo-aleatoires traditionnels que ce soit
rand() ou random(), n'est aucunement garantie. Ca peut tres bien etre des
generateurs pseudo-congruents, ou une autre horreur, sur laquelle %N va
merder de facon catastrophique.
Bonjour,
Le 02/04/2018 à 15:06, Marc Espie a écrit dans le message
<p9t9tj$1i3v$ :Non, je parle toujours du N de la discussion precedente. Revise ton
arithmetique modulaire.
Désolé, je ne comprends pas le message que tu souhaites faire passer, et
vu que tu fais tout pour ne pas l'expliquer simplement en décrivant ce
qui ne cloche, j'abandonne.
Ben evidemment qu'arc4random "marche"...
Je dis depuis le debut que tu ne sais pas quel algo est utilise par random().
La qualite des generateurs pseudo-aleatoires traditionnels que ce soit
rand() ou random(), n'est aucunement garantie. Ca peut tres bien etre des
generateurs pseudo-congruents, ou une autre horreur, sur laquelle %N va
merder de facon catastrophique.
Et toi depuis le début tu m'expliques que la fonction random() est
pourrie alors que je suis intervenu dans la discussion juste pour
fournir une parade à la répartition qui était biaisée par le modulo.
Bonjour,
Le 02/04/2018 à 15:06, Marc Espie a écrit dans le message
<p9t9tj$1i3v$1@saria.nerim.net> :
Non, je parle toujours du N de la discussion precedente. Revise ton
arithmetique modulaire.
Désolé, je ne comprends pas le message que tu souhaites faire passer, et
vu que tu fais tout pour ne pas l'expliquer simplement en décrivant ce
qui ne cloche, j'abandonne.
Ben evidemment qu'arc4random "marche"...
Je dis depuis le debut que tu ne sais pas quel algo est utilise par random().
La qualite des generateurs pseudo-aleatoires traditionnels que ce soit
rand() ou random(), n'est aucunement garantie. Ca peut tres bien etre des
generateurs pseudo-congruents, ou une autre horreur, sur laquelle %N va
merder de facon catastrophique.
Et toi depuis le début tu m'expliques que la fonction random() est
pourrie alors que je suis intervenu dans la discussion juste pour
fournir une parade à la répartition qui était biaisée par le modulo.
Bonjour,
Le 02/04/2018 à 15:06, Marc Espie a écrit dans le message
<p9t9tj$1i3v$ :Non, je parle toujours du N de la discussion precedente. Revise ton
arithmetique modulaire.
Désolé, je ne comprends pas le message que tu souhaites faire passer, et
vu que tu fais tout pour ne pas l'expliquer simplement en décrivant ce
qui ne cloche, j'abandonne.
Ben evidemment qu'arc4random "marche"...
Je dis depuis le debut que tu ne sais pas quel algo est utilise par random().
La qualite des generateurs pseudo-aleatoires traditionnels que ce soit
rand() ou random(), n'est aucunement garantie. Ca peut tres bien etre des
generateurs pseudo-congruents, ou une autre horreur, sur laquelle %N va
merder de facon catastrophique.
Et toi depuis le début tu m'expliques que la fonction random() est
pourrie alors que je suis intervenu dans la discussion juste pour
fournir une parade à la répartition qui était biaisée par le modulo.
Tu verras qu'il ne faut jamais faire % N, mais passer en flottant
et diviser par RAND_MAX, multiplier par N et arrondir...
T'as regarde ce que c'etait qu'un generateur pseudo-aleatoire congruent ?
typiquement c'est un machin sur lequel faire %N va te donner une periode
d'au plus N.
Par exemple, tirer a pile ou face avec un pseudo-aleatoire congruent, a
coup de %2, va te donner au mieux 0 1 0 1 0 1.
[...] là on parle d'afficher une photo au hasard dans un jeu,
il faut donc relativiser.
Non. On commence avec l'affichage d'une photo au hasard d'un jeu, et puis
on passe a autre chose. Ou bien quelqu'un va tomber sur ce code et le
repomper pour autre chose.
On parle ici d'un probleme connu et regle depuis des annees. Je vois zero
raison de ne pas faire les choses correctement. C'est pas comme si c'etait
beaucoup plus complique. Le code necessaire existe deja et peut s'utiliser
sans souci (oui ca existe sous licence BSD, donc tu peux en faire ce que
tu veux, meme pour utilisation commerciale)
Tu verras qu'il ne faut jamais faire % N, mais passer en flottant
et diviser par RAND_MAX, multiplier par N et arrondir...
T'as regarde ce que c'etait qu'un generateur pseudo-aleatoire congruent ?
typiquement c'est un machin sur lequel faire %N va te donner une periode
d'au plus N.
Par exemple, tirer a pile ou face avec un pseudo-aleatoire congruent, a
coup de %2, va te donner au mieux 0 1 0 1 0 1.
[...] là on parle d'afficher une photo au hasard dans un jeu,
il faut donc relativiser.
Non. On commence avec l'affichage d'une photo au hasard d'un jeu, et puis
on passe a autre chose. Ou bien quelqu'un va tomber sur ce code et le
repomper pour autre chose.
On parle ici d'un probleme connu et regle depuis des annees. Je vois zero
raison de ne pas faire les choses correctement. C'est pas comme si c'etait
beaucoup plus complique. Le code necessaire existe deja et peut s'utiliser
sans souci (oui ca existe sous licence BSD, donc tu peux en faire ce que
tu veux, meme pour utilisation commerciale)
Tu verras qu'il ne faut jamais faire % N, mais passer en flottant
et diviser par RAND_MAX, multiplier par N et arrondir...
T'as regarde ce que c'etait qu'un generateur pseudo-aleatoire congruent ?
typiquement c'est un machin sur lequel faire %N va te donner une periode
d'au plus N.
Par exemple, tirer a pile ou face avec un pseudo-aleatoire congruent, a
coup de %2, va te donner au mieux 0 1 0 1 0 1.
[...] là on parle d'afficher une photo au hasard dans un jeu,
il faut donc relativiser.
Non. On commence avec l'affichage d'une photo au hasard d'un jeu, et puis
on passe a autre chose. Ou bien quelqu'un va tomber sur ce code et le
repomper pour autre chose.
On parle ici d'un probleme connu et regle depuis des annees. Je vois zero
raison de ne pas faire les choses correctement. C'est pas comme si c'etait
beaucoup plus complique. Le code necessaire existe deja et peut s'utiliser
sans souci (oui ca existe sous licence BSD, donc tu peux en faire ce que
tu veux, meme pour utilisation commerciale)
Le 02/04/2018 11:04, Marc Espie répondait à Benoît Izac :Tu verras qu'il ne faut jamais faire % N, mais passer en flottant
et diviser par RAND_MAX, multiplier par N et arrondir...
Puis :T'as regarde ce que c'etait qu'un generateur pseudo-aleatoire congruent ?
typiquement c'est un machin sur lequel faire %N va te donner une periode
d'au plus N.
Par exemple, tirer a pile ou face avec un pseudo-aleatoire congruent, a
coup de %2, va te donner au mieux 0 1 0 1 0 1.
Page de man de random() :
https://www.freebsd.org/cgi/man.cgi?query=random&sektion=3&apropos=0&manpath=FreeBSD+11.1-RELEASE+and+Ports
<cit.>
the low dozen bits generated by rand go through a cyclic pattern.
All the bits generated by random() are usable.
For example, `random()&01' will produce a random binary value.
</cit.>
Même si cette page précise bien que le générateur ne donne pas des
nombres complètement imprévisibles, elle dit quand même que n'importe
lesquels des bits se valent. Ce qui veut dire que faire % N n'est pas
plus mauvais que ce que tu proposes en remplacement.
[...] là on parle d'afficher une photo au hasard dans un jeu,
il faut donc relativiser.
Non. On commence avec l'affichage d'une photo au hasard d'un jeu, et puis
on passe a autre chose. Ou bien quelqu'un va tomber sur ce code et le
repomper pour autre chose.
Tiens, récemment quelqu'un m'a reproché le sophisme dit de la pente
savonneuse... on y est presque !
Je suis bien persuadé que quelqu'un comme eyaarmy, incapable d'expliquer
correctement son problème, ne fera pas dès demain un programme qui
nécessite de vrais nombres aléatoires... ou que s'il le fait, il risque
de toute manière de tomber dans d'autres pièges que le simple choix du
générateur de hasard !
On parle ici d'un probleme connu et regle depuis des annees. Je vois zero
raison de ne pas faire les choses correctement. C'est pas comme si c'etait
beaucoup plus complique. Le code necessaire existe deja et peut s'utiliser
sans souci (oui ca existe sous licence BSD, donc tu peux en faire ce que
tu veux, meme pour utilisation commerciale)
Ok. Il suffit donc de répondre à eyaarmy « la solution donnée ne donne
pas un très bon hasard mais on pense que ça devrait te suffire tant
que tu n'expliques pas mieux ton besoin ». Inutile d'en faire une guerre
de religion...
Le 02/04/2018 11:04, Marc Espie répondait à Benoît Izac :
Tu verras qu'il ne faut jamais faire % N, mais passer en flottant
et diviser par RAND_MAX, multiplier par N et arrondir...
Puis :
T'as regarde ce que c'etait qu'un generateur pseudo-aleatoire congruent ?
typiquement c'est un machin sur lequel faire %N va te donner une periode
d'au plus N.
Par exemple, tirer a pile ou face avec un pseudo-aleatoire congruent, a
coup de %2, va te donner au mieux 0 1 0 1 0 1.
Page de man de random() :
https://www.freebsd.org/cgi/man.cgi?query=random&sektion=3&apropos=0&manpath=FreeBSD+11.1-RELEASE+and+Ports
<cit.>
the low dozen bits generated by rand go through a cyclic pattern.
All the bits generated by random() are usable.
For example, `random()&01' will produce a random binary value.
</cit.>
Même si cette page précise bien que le générateur ne donne pas des
nombres complètement imprévisibles, elle dit quand même que n'importe
lesquels des bits se valent. Ce qui veut dire que faire % N n'est pas
plus mauvais que ce que tu proposes en remplacement.
[...] là on parle d'afficher une photo au hasard dans un jeu,
il faut donc relativiser.
Non. On commence avec l'affichage d'une photo au hasard d'un jeu, et puis
on passe a autre chose. Ou bien quelqu'un va tomber sur ce code et le
repomper pour autre chose.
Tiens, récemment quelqu'un m'a reproché le sophisme dit de la pente
savonneuse... on y est presque !
Je suis bien persuadé que quelqu'un comme eyaarmy, incapable d'expliquer
correctement son problème, ne fera pas dès demain un programme qui
nécessite de vrais nombres aléatoires... ou que s'il le fait, il risque
de toute manière de tomber dans d'autres pièges que le simple choix du
générateur de hasard !
On parle ici d'un probleme connu et regle depuis des annees. Je vois zero
raison de ne pas faire les choses correctement. C'est pas comme si c'etait
beaucoup plus complique. Le code necessaire existe deja et peut s'utiliser
sans souci (oui ca existe sous licence BSD, donc tu peux en faire ce que
tu veux, meme pour utilisation commerciale)
Ok. Il suffit donc de répondre à eyaarmy « la solution donnée ne donne
pas un très bon hasard mais on pense que ça devrait te suffire tant
que tu n'expliques pas mieux ton besoin ». Inutile d'en faire une guerre
de religion...
Le 02/04/2018 11:04, Marc Espie répondait à Benoît Izac :Tu verras qu'il ne faut jamais faire % N, mais passer en flottant
et diviser par RAND_MAX, multiplier par N et arrondir...
Puis :T'as regarde ce que c'etait qu'un generateur pseudo-aleatoire congruent ?
typiquement c'est un machin sur lequel faire %N va te donner une periode
d'au plus N.
Par exemple, tirer a pile ou face avec un pseudo-aleatoire congruent, a
coup de %2, va te donner au mieux 0 1 0 1 0 1.
Page de man de random() :
https://www.freebsd.org/cgi/man.cgi?query=random&sektion=3&apropos=0&manpath=FreeBSD+11.1-RELEASE+and+Ports
<cit.>
the low dozen bits generated by rand go through a cyclic pattern.
All the bits generated by random() are usable.
For example, `random()&01' will produce a random binary value.
</cit.>
Même si cette page précise bien que le générateur ne donne pas des
nombres complètement imprévisibles, elle dit quand même que n'importe
lesquels des bits se valent. Ce qui veut dire que faire % N n'est pas
plus mauvais que ce que tu proposes en remplacement.
[...] là on parle d'afficher une photo au hasard dans un jeu,
il faut donc relativiser.
Non. On commence avec l'affichage d'une photo au hasard d'un jeu, et puis
on passe a autre chose. Ou bien quelqu'un va tomber sur ce code et le
repomper pour autre chose.
Tiens, récemment quelqu'un m'a reproché le sophisme dit de la pente
savonneuse... on y est presque !
Je suis bien persuadé que quelqu'un comme eyaarmy, incapable d'expliquer
correctement son problème, ne fera pas dès demain un programme qui
nécessite de vrais nombres aléatoires... ou que s'il le fait, il risque
de toute manière de tomber dans d'autres pièges que le simple choix du
générateur de hasard !
On parle ici d'un probleme connu et regle depuis des annees. Je vois zero
raison de ne pas faire les choses correctement. C'est pas comme si c'etait
beaucoup plus complique. Le code necessaire existe deja et peut s'utiliser
sans souci (oui ca existe sous licence BSD, donc tu peux en faire ce que
tu veux, meme pour utilisation commerciale)
Ok. Il suffit donc de répondre à eyaarmy « la solution donnée ne donne
pas un très bon hasard mais on pense que ça devrait te suffire tant
que tu n'expliques pas mieux ton besoin ». Inutile d'en faire une guerre
de religion...
Je dis depuis le debut que tu ne sais pas quel algo est utilise par random().
La qualite des generateurs pseudo-aleatoires traditionnels que ce soit
rand() ou random(), n'est aucunement garantie. Ca peut tres bien etre des
generateurs pseudo-congruents, ou une autre horreur, sur laquelle %N va
merder de facon catastrophique.
Je dis depuis le debut que tu ne sais pas quel algo est utilise par random().
La qualite des generateurs pseudo-aleatoires traditionnels que ce soit
rand() ou random(), n'est aucunement garantie. Ca peut tres bien etre des
generateurs pseudo-congruents, ou une autre horreur, sur laquelle %N va
merder de facon catastrophique.
Je dis depuis le debut que tu ne sais pas quel algo est utilise par random().
La qualite des generateurs pseudo-aleatoires traditionnels que ce soit
rand() ou random(), n'est aucunement garantie. Ca peut tres bien etre des
generateurs pseudo-congruents, ou une autre horreur, sur laquelle %N va
merder de facon catastrophique.
[...]
[...]
[...]
Tu verras qu'il ne faut jamais faire % N, mais passer en flottant
et diviser par RAND_MAX, multiplier par N et arrondir...
[...]
Trouve-moi une spec de random() qui precise la qualite du generateur.
Je ne parle pas d'une implementation en particulier, mais bien d'une garantie
que random() va etre bien.
[...]
Je pense aussi que ca vaut le coup d'avoir une discussion archivee qui
explique ce qu'il en est... [...]
Tu verras qu'il ne faut jamais faire % N, mais passer en flottant
et diviser par RAND_MAX, multiplier par N et arrondir...
[...]
Trouve-moi une spec de random() qui precise la qualite du generateur.
Je ne parle pas d'une implementation en particulier, mais bien d'une garantie
que random() va etre bien.
[...]
Je pense aussi que ca vaut le coup d'avoir une discussion archivee qui
explique ce qu'il en est... [...]
Tu verras qu'il ne faut jamais faire % N, mais passer en flottant
et diviser par RAND_MAX, multiplier par N et arrondir...
[...]
Trouve-moi une spec de random() qui precise la qualite du generateur.
Je ne parle pas d'une implementation en particulier, mais bien d'une garantie
que random() va etre bien.
[...]
Je pense aussi que ca vaut le coup d'avoir une discussion archivee qui
explique ce qu'il en est... [...]
Le 03/04/2018 17:40, Marc Espie m'a répondu :Tu verras qu'il ne faut jamais faire % N, mais passer en flottant
et diviser par RAND_MAX, multiplier par N et arrondir...
[...]
Trouve-moi une spec de random() qui precise la qualite du generateur.
Je ne parle pas d'une implementation en particulier, mais bien d'une garantie
que random() va etre bien.
Je n'en ai pas. J'ai lu le man de GNU-Linux et celui de freebsd.org.
Celui de freebsd.org, j'en ai mis un lien. Quant à celui de GNU-Linux,
il dit que chez eux le rand() est implémenté comme random(), mais que
pour avoir un code portable il faut utiliser random() plutôt que rand()
si on veut utiliser les bits de poids faible sans avoir le biais des
anciennes implémentations de rand().
Cela étant dit, ...[...]
Je pense aussi que ca vaut le coup d'avoir une discussion archivee qui
explique ce qu'il en est... [...]
Bon, je suis d'accord. Du coup, Fermons la discussion. J'ai donné
un code qui n'était pas optimal, tout le monde a bien compris que ce
n'était pas le meilleur qui soit, mais pour que ce fil de discussion
serve à quelque chose il ne te reste plus qu'à donner un exemple de
code qui ne soit pas sujet aux critiques comme le mien.
Le 03/04/2018 17:40, Marc Espie m'a répondu :
Tu verras qu'il ne faut jamais faire % N, mais passer en flottant
et diviser par RAND_MAX, multiplier par N et arrondir...
[...]
Trouve-moi une spec de random() qui precise la qualite du generateur.
Je ne parle pas d'une implementation en particulier, mais bien d'une garantie
que random() va etre bien.
Je n'en ai pas. J'ai lu le man de GNU-Linux et celui de freebsd.org.
Celui de freebsd.org, j'en ai mis un lien. Quant à celui de GNU-Linux,
il dit que chez eux le rand() est implémenté comme random(), mais que
pour avoir un code portable il faut utiliser random() plutôt que rand()
si on veut utiliser les bits de poids faible sans avoir le biais des
anciennes implémentations de rand().
Cela étant dit, ...
[...]
Je pense aussi que ca vaut le coup d'avoir une discussion archivee qui
explique ce qu'il en est... [...]
Bon, je suis d'accord. Du coup, Fermons la discussion. J'ai donné
un code qui n'était pas optimal, tout le monde a bien compris que ce
n'était pas le meilleur qui soit, mais pour que ce fil de discussion
serve à quelque chose il ne te reste plus qu'à donner un exemple de
code qui ne soit pas sujet aux critiques comme le mien.
Le 03/04/2018 17:40, Marc Espie m'a répondu :Tu verras qu'il ne faut jamais faire % N, mais passer en flottant
et diviser par RAND_MAX, multiplier par N et arrondir...
[...]
Trouve-moi une spec de random() qui precise la qualite du generateur.
Je ne parle pas d'une implementation en particulier, mais bien d'une garantie
que random() va etre bien.
Je n'en ai pas. J'ai lu le man de GNU-Linux et celui de freebsd.org.
Celui de freebsd.org, j'en ai mis un lien. Quant à celui de GNU-Linux,
il dit que chez eux le rand() est implémenté comme random(), mais que
pour avoir un code portable il faut utiliser random() plutôt que rand()
si on veut utiliser les bits de poids faible sans avoir le biais des
anciennes implémentations de rand().
Cela étant dit, ...[...]
Je pense aussi que ca vaut le coup d'avoir une discussion archivee qui
explique ce qu'il en est... [...]
Bon, je suis d'accord. Du coup, Fermons la discussion. J'ai donné
un code qui n'était pas optimal, tout le monde a bien compris que ce
n'était pas le meilleur qui soit, mais pour que ce fil de discussion
serve à quelque chose il ne te reste plus qu'à donner un exemple de
code qui ne soit pas sujet aux critiques comme le mien.