Je pense que ce que je vais proposer risque d'être trop long et pas économique:
Tu parcours la liste et tu recherche la lettre A, tu place l'item n° dans une liste de numéro d'items et tu incrémente la variable qui indique le nombre max d'items dans cette liste.
Donc ça donne
int items=0;
int i;
unsigned char lst[10];
for (i=0;i<10;i++) {
if (strchr (ListChar[i],"A")!=NULL) lst[items++]=i;}
Puis il te reste à faire un random sur la liste lst qui te donne un item dans la ListChar.
La technique de vince a un gros problème: les choix ne sont pas équiprobables! Par exemple... (Ah non, c'est un mauvais exemple... J'en cherche un autre.)
Pour avoir des choix équiprobables avec la méthode de vince, il faut connaître le nombre d'éléments valides, c'est-à-dire qu'il faut utiliser la boucle de geogeo, mais on n'a pas besoin de recopier les éléments, juste de les compter. Cela dit, la solution de geogeo est peut-être meilleure, parce que si tu comptes les éléments valides, puis tu appliques la méthode de vince, tu es obligé de faire tous les tests 2 fois.
Bon, déjà, le 14 dans l'exemple de vince est foireux, parce que c'est plus grand que le nombre d'éléments de la liste, c'est-à-dire 10. Mais dans son exemple, les éléments sont équiprobables par pur hasard (parce que le nombre d'éléments valides divise le nombre total d'éléments), donc il nous faut un autre:
{ABC,BDE,AEF,ABE,CDD,ADE,BCF,ACD} (8 éléments, dont 5 valides)
Ici, ABC, AEF et ABE peuvent être choisis de 2 manières chacun, ADE et ACD seulement d'une seule manière. Donc au lieu d'avoir des probabilités 1/5 pour chacun, tu as des probabilités 2/8=1/4 pour les premiers et 1/8 pour ADE et ACD.
la seul methode rapide est de faire un tri bien avant que tu rentres ses info dasn ta table..
Merde, Kevin a été plus rapide que moi.
En effet, la méthode de vince ne permet pas d'équiprobabilité dans les choix.
Et pourquoi tu ne peux pas avoir une seconde liste dans laquelle tu mets les indices des élements de la première liste qui peuvent être choisis et tu fais ton rand dans la deuxième liste ?
Bref, la technique de geogeo, quoi.
Bah ce que tu peux faire, c'est par exemple au lieu d'allouer de l'espace pour les N éléments de ta liste, tu alloues de l'espace pour 2N éléments, comme ça c'est plus simple à coder, et tu n'auras besoin de faire des opérations de réallocation que lorsque le nombre d'élément changera. A chaque fois, tu réalloueras 2N*sizeof(élément).
Puis à chaque fois que tu auras besoin de faire ton rand, tu fais le tri (linéaire) qui consiste à vérifier si chaque élément de la liste fait partie de ceux qui seront choisis, et tu les places directement après la liste, dans les N éléments restant.
Et tu fais ton rand dans cette deuxième partie de liste.
Je pense que c'est peu coûteux et c'est totalement équiprobable.
Tu peux éventuellement sauver le type d'élément à chercher pour ne pas avoir à refaire le tri dans le cas où tu chercherais plusieurs fois de suite le même élément.
tu fait un tris ( A, B C ) tout vide au debut du programme c'est possible
apres a l'aide de liste chainé tu complettes tes piles
apres la suite tu la devines. c'est la seule methode rapide et applicable
jackiechan Le 29/07/2003 à 19:19Edité par jackiechan le 29/07/2003 à 19:40 Oui, mais elle peut demander jusqu'à N*nb_de_critères octets en plus.
Mais c'est vrai que si sa liste est longue, ma méthode (celle de geogeo en fait) risque d'être un peu lente peut-être.
ha bon?
tu as combien de combiniasion possible?
Mué j'ai pas tout lu mais ce que je ferai c'est un rand(dim de la liste) et avancer jusqu'au prochain élément correct. OK c'est pas équiprobable, mais il s'en faut de peu. Au pire on fait un autre rand pour savoir si on avance ou on recule jusqu'au prochain élément. En bouclant les extrémités bien sûr.

Que cache le pays des Dieux ? -
Forum Ghibli -
Forum LittéraireLa fin d'un monde souillé est venue. L'oiseau blanc plane dans le ciel annonçant le début d'une longue ère de purification. Détachons-nous à jamais de notre vie dans ce monde de souffrance. Ô toi l'oiseau blanc, l'être vêtu de bleu, guide nous vers ce monde de pureté. - Sutra originel dork.
Zeph Le 29/07/2003 à 19:43 Cette solution approche celle de Vince, donc a les mêmes problèmes :-/
Jackosking > Combinaisons ???

All right. Keep doing whatever it is you think you're doing.
------------------------------------------
Besoin d'aide sur le site ? Essayez
par ici :)
ABC,BDE,AEF,ABE,BCF,CDD,ADE,BCF,ACD,BCD
=> le nombre de triplets possibles?
Zeph Le 29/07/2003 à 20:00 Ah nan mais ça c'était un exemple. C'est plutot une liste de structures qui aurait un char "valide", et c'est ce char qui est utilisé pour définir un element valide / invalide. Par exemple à une frame, seules les structures dont la variable "valide" vaut 60 sont selectionables, puis à la frame suivante c'est la valeur 156, etc...

All right. Keep doing whatever it is you think you're doing.
------------------------------------------
Besoin d'aide sur le site ? Essayez
par ici :)
Il te reste encore une autre méthode.
Tu applique une fonction de trie à ta liste et tu pose une varaible qui identique ou le trie ce termine dans ta liste, il te reste à faire un rand.
Problème tu doit utiliser encore un for pour trier et encore une liste temporaire et aussi je pense que ça sera plus lent que ma méthode précédente.
Mais la fonction dans ma méthode de faire une liste correcte d'item tu ne l'a fait pas 4 fois par frame. Tu effectue seulement le random donc je trouve que ma solution et la plus rapide dans ce cas puisque la boucle for tu ne la fera que 1 fois par frame?
J'en voit pas d'autre sans utiliser une autre liste et effectuer un minimum d'opération de trie dessus.
Je vois pas te conseillier d'autre, surtout que tu as l'air de demander énormément de vitesse. Ou tu fait une allocation définitive de la liste temporaire au lancement du prog mais la tu perd de la mémoire et tu gagne de la vitesse. Faut voir.