1

je trouve que la commande
srand() et rand() en c ne sont pas vraiment performante pour obtenir une valeur aleatoire
on m'a conseiller d'initialiser la table par un srand ( time(NULL) );
mais c'est vraiment pas beaucoup mieux.
Est ce que vous avez une idée ou une fonction qui marche bien? Ou bien faut il que je me fasse une vrai fausse table aleatoire ?

2

T'as essayé d'initialiser le générateur de nombres aléatoires avec srand(SDL_GetTicks())?
Ça devrait être pareil qu'avec time(NULL), mais on ne sait jamais.
Ce qui est vraiment important, c'est de pas exécuter l'instruction au début du programme, mais quand le joueur a pressé au moins un bouton.
Moi je met ça aprés que le joueur ait appuyé sur START.

3

thyphoon :
Est ce que vous avez une idée ou une fonction qui marche bien?

Il existe sous linux (j'ignore si ca existe ailleurs, mais donc a priori ca va etre dispo sur la console) d'un device générateur de nombre aléatoire (/dev/random) dont le but est justement la fiabilité de l'impossibilité de prédiction (très important pour des raisons de sécurité dans les cryptages). On s'en sert normalement en l'ouvrant comme un fichier et en lisant dedans, mais je te laisse chercher sur le net si ca t'interesse.

4

je vais essayer avec SDL_GetTicks()) mais ça ne change rien
En gros a chaque fois que je presse une certaine touche ça doit faire apparaitre un bonus a un endroit aléatoire (horizotnalement)... MAis ça c'est toujours pareille !ça commence a gauche et ça vas vers la droite et si j'appuie de façon regulière sur cette touche ...les bonus apparaisse les un apres les autres de gauche a droite...
sad

5

tout depend de se que tu veux faire, si par exemple, tu souhaites faire un random d'un nombre entre 1 et 10, le plus simple et le plus rapide et de créer un tableau du style

byte random_1_to_10[256]={2,10,9,3,4,4,5,9,6,2,8,10,1,7,1,3,5,6,8,7,.......};
byte random_count;


resultat=random_1_to_10[random_count]; random_count++;


// rajouter a chaque fin de traitement graphiques.
random_count++;

6

CoderMan :
tout depend de se que tu veux faire, si par exemple, tu souhaites faire un random d'un nombre entre 1 et 10, le plus simple et le plus rapide et de créer un tableau du style

byte random_1_to_10[256]={2,10,9,3,4,4,5,9,6,2,8,10,1,7,1,3,5,6,8,7,.......};
byte random_count;


resultat=random_1_to_10[random_count]; random_count++;


// rajouter a chaque fin de traitement graphiques.
random_count++;

oui c'est un peu ce que je comptais faire...embarrassed) Merci beaucoup

7

thyphoon :
je vais essayer avec SDL_GetTicks()) mais ça ne change rien
En gros a chaque fois que je presse une certaine touche ça doit faire apparaitre un bonus a un endroit aléatoire (horizotnalement)... MAis ça c'est toujours pareille !ça commence a gauche et ça vas vers la droite et si j'appuie de façon regulière sur cette touche ...les bonus apparaisse les un apres les autres de gauche a droite...
sad


Erreur dans ta source, je présume. Je peux regarder ça si tu veux.

8

Le generateur aleatoire de la libc est lent en plus d'etre pourri smile

Il existe un generateur aleatoire à la fois rapide et fournissant des resultats de qualité (tres grande periode) : le Mersenne Twister, on trouve facilement de la doc et du code source C sur le net :

http://www.math.sci.hiroshima-u.ac.jp/~m-mat/MT/emt.html
http://en.wikipedia.org/wiki/Mersenne_twister

developpeur de jeux mobiles chez int13 production --- http://int13.net

9

GCarrier
:
thyphoon :
je vais essayer avec SDL_GetTicks()) mais ça ne change rien
En gros a chaque fois que je presse une certaine touche ça doit faire apparaitre un bonus a un endroit aléatoire (horizotnalement)... MAis ça c'est toujours pareille !ça commence a gauche et ça vas vers la droite et si j'appuie de façon regulière sur cette touche ...les bonus apparaisse les un apres les autres de gauche a droite...
sad


Erreur dans ta source, je présume. Je peux regarder ça si tu veux.


Ouais, je pense aussi que c'est un défaut dans ton prog et pas la faute du générateur.
Il faut voir ça de plus prés.

10

StephC_int13 :
Le generateur aleatoire de la libc est lent en plus d'etre pourri smile


De TA libc peut-être, mais ne généralise pas s'il te plait. Entre Debian et Windows, c'est pas la même par exemple (glibc sous Debian, mais tu pourrais en utiliser d'autres...). Les spécifications de la libc n'impose pas des algorithmes pourris. (Ceci dit, je ne connais pas très bien celui de ma machine...)

11

GCarrier
:
StephC_int13 :
Le generateur aleatoire de la libc est lent en plus d'etre pourri smile


De TA libc peut-être, mais ne généralise pas s'il te plait. Entre Debian et Windows, c'est pas la même par exemple (glibc sous Debian, mais tu pourrais en utiliser d'autres...). Les spécifications de la libc n'impose pas des algorithmes pourris. (Ceci dit, je ne connais pas très bien celui de ma machine...)


Bah generalement, les fonctions des differentes lib C std sont au mieux acceptables, et parfois franchement lentes, et j'ai eu l'occasion d'en tester de nombreuses smile

Je t'invite à bencher le random de differentes lib C à coté du Mersenne Twister.

Cela dit j'ai surtout l'experience des machines mobiles tournant sous processeur ARM, ce qui implique des optimisations specifiques qui sont souvent pas fournies dans les lib std.





developpeur de jeux mobiles chez int13 production --- http://int13.net

12

Merci a tous je vais essayer tout ça et voir si _ça vient vraiment de mon code ou pas... En tout cas un grand merci pour vos reponse

13

StephC_int13 :
Le generateur aleatoire de la libc est lent en plus d'etre pourri smile

Il existe un generateur aleatoire à la fois rapide et fournissant des resultats de qualité (tres grande periode) : le Mersenne Twister, on trouve facilement de la doc et du code source C sur le net :

http://www.math.sci.hiroshima-u.ac.jp/~m-mat/MT/emt.html
http://en.wikipedia.org/wiki/Mersenne_twister


ça marche super merci ! smile

14

-

15


Suis d'accord avec Orion_, avec un rand correctement initialisé tu dois arriver à une solution satisfaisante, surtout si c'est juste pour faire une répartition dans un jeu. oui

16

Franchement le rand du C est pourri, il suffit de l'avoir utilisé une fois pour en être convaicu.
De plus c'est valable pour toutes les plateforme, c'est lié à la spec du langage.

17

Ah ? Tu peux développer ton point de vue ? Ça m'intéresse... Parce que les spécs je les ai lues et je vois absolument pas le problème...

18

Orion_
:
CoderMan :
tout depend de se que tu veux faire, si par exemple, tu souhaites faire un random d'un nombre entre 1 et 10, le plus simple et le plus rapide et de créer un tableau du style

byte random_1_to_10[256]={2,10,9,3,4,4,5,9,6,2,8,10,1,7,1,3,5,6,8,7,.......};
byte random_count;


resultat=random_1_to_10[random_count]; random_count++;


// rajouter a chaque fin de traitement graphiques.
random_count++;

c'est hyper limité comme solution ça ... déja parceque la périodes est petite et en plus parceque le nombre max est limité, c'est encore pire que rand()


Pas dutout, 256 posibilités c'est énorme !

1er, lorsque tu joues tu ne fais jamais attention au rythme d'apparition d'un random a moins d'être un cyborg
2ème, c'est de l'aléatoire et non un formule matématique ou tout doit être précis.
3ème, le joueur ne sait pas les valeur du tableau pendant qu'ils jouent ( et même le programmeur je penses... )

Tu n'es pas limité vu que la periode, c'est toi qui la fixe en créent ton tableau perso, là c'etait un exemple et non une solution général (
S'il veut faire un bonus aléatoire de 1 à 5, il créer son tableau
"byte random_1_to_5[256]={2,5,3,1,4,4,5,2,1,2,3,1,1,4,1,3,5,2,2,1,.......}; "
Si tu veux plus de possibilité tu augmentes le tableau.

typhoon veut faire apparaitre un bonus a un endroit aléatoire en horizontal, pas de prob, il fait un tableau de 256 (ou plus)...même si l'écran fait 2048 pixel de longeur.

"byte random_1_to_2048[256]={1,246,1510,1021,844,34,1455,232,41,1282,433,1921,141,345,41,1249,185,652,1052,1521,.....etc.....}; "

ici on ne parle pas d'une routine généraliste utilisé dans un sdk mais une tableau perso pour son "propre" jeu.

Pendant que vous jouez, vous trouvez votre comptes, vous avez 256 possibilitées différent (avec cette exemple) que le bonus apparaisent quelques part à l'écran.

Pas assez précis ? non mais franchement, vous pensez que ca va changer quelques choses au gameplay que le bonus apparait avec un aléatoire parfait de 2048 à 1 pixel près. Le plaisir du jeu sera toujours le même. Le reste c'est du chipotage. La perfection ne se fait pas dans le random mais dans le gameplay.

Orion, faudrais que tu m'expliques ce que tu veut dire par hyper limité en me donnant des examples parceque là, je vois pas ou tu veux en venir.

19

-

20

lollllll je voulais pas lancer une guerre sur l'aléaoitre... wink
Je pense que tout le monde a raison...tout depend de l'utilisation qu'on en fait ... tongue

21

heu je sais pas a quoi tu joues origon mais c'est pas drôle c'est même penible...tu cherches pas a comprendre (ou tu n'as pas compris)

sinon oui, un jeu avec 3600 random different...oui ca doit surement exister...
Ce n'est pas limité, et ton histoire de modulo( rien avoir ) et de starfield 256/5 ( ??? ), confirme que tu n'as pas compris d'un yota le sense de ce petit bout de code.
Pour te decevoir ( désolé ) le tableau est très facile a réaliser, suffit de réalisé avec....heu....qbasic...ca te va ca?

debut = 1
fin = 1024
taille = 256
d$ = LTRIM$(STR$(debut))
f$ = LTRIM$(STR$(fin))
t$ = LTRIM$(STR$(taille))
str1$ = "const int random_" + d$ + "_to_" + f$ + "[" + t$ + "]"
OPEN "c:\result.txt" FOR OUTPUT AS #1
PRINT #1, str1$ + " = {";
FOR a = 1 TO taille
PRINT #1, INT(debut + (RND(1) * (fin + 1 - debut)));
IF a < taille THEN PRINT #1, ",";
NEXT a
PRINT #1, "};"
CLOSE #1
si tu ne comprend pas le qbasic, fait une recherche de "tutorial pour newbies qbasic"
hohoho ca c'est de l'insulte de geek computeresque, ca vole bas, tu peux pas faire mieux je penses...

non mais sans moquerie comme thyphoon, tout dépend de l'utilisation, la c'était pour son bonus aléatoire, comme quoi faut lire avant...

insolent.

22

-

23

CoderMan :

non mais sans moquerie comme thyphoon, tout dépend de l'utilisation, la c'était pour son bonus aléatoire, comme quoi faut lire avant...

insolent.


Je me demande qui est insolent et qui sait coder ici smile

Generer un tableau, en dehors du temps que ça prend (à la main ou avec un script) c'est vraiment beaucoup de boulot pour un resultat que je qualifierai de "rand du pauvre".

Ca va evidement convenir dans pas mal de cas, mais une fonction generaliste est quand même bienvenue, d'autant plus que contrairement au tableau elle ne risque pas de reduire la coherence du cache en le remplissant avec des valeurs aleatoires (sic).

Un rand correct (comme celui dont le source est dispo) + un modulo ou un masque si le modulo est une puissance de 2 (pour eviter la division cachée dans le modulo, car comme vous savez les processeurs ARM n'ont pas de division cablée).

Quand (visiblement) on ne sait pas, on se tait smile





developpeur de jeux mobiles chez int13 production --- http://int13.net

24

Hé les enfants on se calme.
Restez zen ...c'est moi ici le gros nulos qui s'est pas programmé ! wink Je vous remercie tous de m'avoir aider. Tout le monde ici m'a apporter quelques choses d'interessant. Pas la peine de vous ecorcher vif pour ça. smile

25

le code en basic, c'est pour générer le tableau !
non ça ne me va pas, ne me prend pas pour un neuneu, et fallait peut etre reflechir ne serais-ce que 3secondes avant de sortir cette connerie, on critique ici le rand du C qui n'est pas très efficace et qui ce repete souvent ok ? et toi tu préconise quoi ? créer un tableau initialisé avec des nombre d'un rand du ... qbasic ! qbasic qui est programmé en C donc qui utilise surement le rand du C, ah ben génial, on en arrive au même resultat qu'en utilisant le rand de la lib C, trop bien ta solution

--->
Est ce que vous avez une idée ou une fonction qui marche bien? Ou bien faut il que je me fasse une vrai fausse table aleatoire ?
En gros a chaque fois que je presse une certaine touche ça doit faire apparaitre un bonus a un endroit aléatoire (horizotnalement)... MAis ça c'est toujours pareille !ça commence a gauche et ça vas vers la droite et si j'appuie de façon regulière sur cette touche ...les bonus apparaisse les un apres les autres de gauche a droite...


compris maintenant ???

et oui je sais utiliser une fonction random en c, mais franchement avant que tu me face ta remarque sur le random super limité, apprend à lire !
"rand du pauvre".

encore une fois, random de pauvre ou de riche, dans un jeu, ca ne change strictement RIEN !
Quand (visiblement) on ne sait pas, on se tait

je te retourne le compliment.

26

-

27

L'aléatoire pour son bonus se fait, pourquoi tu t'obstines a dire que c'est limité alors que ça ne l'ai absolument pas vu que c'est personnalisé ? je te comprend pas.

28

CoderMan :
L'aléatoire pour son bonus se fait, pourquoi tu t'obstines a dire que c'est limité alors que ça ne l'ai absolument pas vu que c'est personnalisé ? je te comprend pas.


La difference mon pti monsieur, c'est que dans un cas on a une solution generale, efficace, simple et elegante sur laquelle il ne sera jamais besoin de revenir (une fois la fonction codée), de l'autre on a une solution boiteuse qui s'avere être suffisante dans des cas peu exigeants et qui de plus necessitera un travail à chaque fois que les besoins changent (regeneration de tableau etc...)

Conclusion : ta solution vaut un zero pointé wink



developpeur de jeux mobiles chez int13 production --- http://int13.net

29

stephC_int13: je te conseil d'ecouté les paroles de la track 9 de l'album de tété "a la faveur de l'automne", ca peut te servir pour plus tard.

Premierement ma solution etait la pour aider Typhoon et c'est chose faite (suffit de lire ca réaction)
Deuxièmement il y n'y a aucune prétantion, elle etait juste là pour trouver une alternative a son rand() qui ne fonctionnait pas.
Troisièmement, je n'ai plus a débattre sur un tout petit bout de code efficace qui fonctionne très bien.
Quatrièmement, je n'ai rien contre les fonctions standard random comme tu le décris, je l'utilise assez souvant.
Cinquièmement, tu as beau codé classieusement, d'une manière ultra pro, dans un jeu grand monsieur c'est le gameplay a mettre en haut de la liste, tu as beau être un géni de la prog, si ton gameplay et naze, ton classieux, tu peux le mettre où je penses. Le random tableau peut être très utiles pour certain cas (etudier l'aléatoire dans un niveau pour qu'il n'apparaissent jamais à tel endroit ex. entre 10 et 100). Et oui c'est le résultat qui compte et ce n'est pas 3 lignes de code (1 pour le tableau, 1 pour le random et 1 pour l'incrémentation à la fin) qui va risqué de compromettre l'élégance du code royale de Monsieur.

30

Orion_ :
alors au lieux de créer 50 tableau avec chaqu'un des valeurs max differente comme tu le propose, y'a un truc supere qui s'appel modulo: exemple quand tu veut limiter le nombre que tu reçoit du rand a 5, tu fait rand()%5, et petite optimisation que je te file: si c'est un nombre en puissance de 2, au lieux de faire genre: rand()%32, tu fait rand()&31, c'est beaucoup plus rapide


À titre d'info, pas la peine de se prendre le chou avec ce genre d'optimisations : GCC le fera lui-même (eh ouais il est pas con...)