Page 1 sur 1

Aléatoire décremental, comment faire ?

Posté : jeu. 24 mars 2022, 16:23
par deratiseur
Je voudrais recréer le paquet de cartes qui existe dans l'Interplan.
Pour info, le paquet contient 21 cartes, et chaque tirage d'une carte la fait disparaitre.

On a donc un paquet de cartes initial de 21 cartes, donc 21 cartes aléatoires. puis on a plus que 20 cartes aléatoires, puis plus que 19, etc....
problème : si le premier paquet est facile, une carte aléatoire sur 21, le deuxième est problématique puisque je devrait créer 21 paquets différents, chacun correspondant à une carte en moins différentes. Puis je devrais créer 21x20 troisième paquet (avec 2 cartes "aléatoires" en moins), puis 19x20x21 4eme paquet (avec 3 cartes "aléatoires" en moins), etc...
Même l'avant dernier "paquet" ou il n'en reste que deux cartes doit être au nombre de 420 -> 420 duo de cartes possibles, et doit prendre en compte tout ce qui a été tiré avant, donc ce n'est PAS juste 420 objets.
Et le denier paquet, une carte seule, peut être une des 21 existante, mais doit prendre en compte toute ce qui et doit prendre en compte tout ce qui a été tiré avant, donc ce n'est PAS juste 21 objets.

A part faire un nombre inimaginable d'objets, je ne vois pas comment faire. C'est pour ça qu'actuellement le paquet n'est pas aléatoire et utilise les cartes dans un ordre prédeterminé. mais je voudrais corriger ça pour passer à un "vrai" decj aléatoire de 43 cartes.


Un(e) mathématicien(e) ou adepte de script génial(e) aurait t'il une solution simple à me proposer ?

Posté : jeu. 24 mars 2022, 21:49
par Freddy_Gwendo
Tu sais combien de combinaisons possibles ça fait au total ?
► Afficher le texte
Oui, tu as bien lu. Je te laisse faire le calcul avec 43 cartes. :whistle3:

À moins de passer par une créature invisible qui gère ça par script et te donne à chaque fois un seul des 21 objets (tu n'en aurais que 21), bonjour l'angoisse. Et encore, pas sûr que ce soit simple à coder à partir de couples Global("objet1",GLOBAL,0) / Global("objet1",GLOBAL,1) | Global("objet2",GLOBAL,0) / Global("objet2",GLOBAL,1)...

Posté : jeu. 24 mars 2022, 22:15
par Mornagest
Oui, logiquement en probabilités, tu dois faire la factorielle de 21, ce qui est un peu déconnant en terme de codage.

Est-ce que tu n'aurais pas plutôt idée de créer quelques versions différentes de ton deck de cartes et que le joueur en trouve un aléatoirement parmi ces quelques exemplaires (les autres étant dans ce cas introuvables par ailleurs) ?

Posté : ven. 25 mars 2022, 07:37
par Freddy_Gwendo
J'ai un peu réfléchi à ton truc, et...

Si je devais le coder pour, disons 5 objets, je crois que j'utiliserais un objet unique qui créerait une créature invisible. Plus les 5 objets, ça ne fait que 6 objets à créer.

À sa création, la créature invisible se verrait assigner un script qui dépendrait de l'historique du tirage et serait déterminé selon six variables :

Variable valeurs possibles
nb_objets_tires 0 à 4
objet1 0 / 1 (déjà tiré)
objet2 0 / 1 (déjà tiré)
objet3 0 / 1 (déjà tiré)
objet4 0 / 1 (déjà tiré)
objet5 0 / 1 (déjà tiré)
Du coup, au premier tirage, toutes les variables sont nulles. Le script par défaut est simple :

RandomNum(5,n) ==> on donne l'objet n

Pour chaque objet, la variable objetn passe à 1 s'il a été tiré.
La variable nb_objets_tires augmente de 1.

Au deuxième tirage, selon la valeur de nb_objets_tires et de tous les objetn, on assigne un nouveau script à la créature. Et rebelotte ! Jusqu'à ce qu'il n'y ait plus qu'un objet.

Ainsi, on peut limiter le nombre de scripts.

Pour un troisième tirage, par exemple, les tirages

1 2 3 4 5
1 2 3 5 4
1 2 4 3 5
1 2 4 5 3
1 2 5 3 4
1 2 5 4 3
2 1 3 4 5
2 1 3 5 4
2 1 4 3 5
2 1 4 5 3
2 1 5 3 4
2 1 5 4 3

utiliseront le même script (on tire aléatoirement soit l'objet3, soit l'objet4, soit l'objet5 ; peu importe l'ordre de tirage).

Et c'est encore plus flagrant pour le quatrième tirage et le dernier qui, lui, n'en a besoin que de cinq.

En plus, je suis quasiment certain, qu'en cherchant bien, on doit pouvoir trouver un moyen d'écrire ces scripts automatiquement avec WeiDU lors de l'installation. De la même manière que celle que je t'avais indiquée pour le DUKP.


Note : je parle d'objets par convention, mais ça fonctionne aussi avec des effets appliqués par des sorts.

Posté : ven. 25 mars 2022, 17:25
par deratiseur
Merci. je vais essayer de décrypter ça. Enfin, quand j'y reviendrais après avoir finalisé les 5 derniers autres trucs commencés dans ma TODO liste ^^

Re: Aléatoire décremental, comment faire ?

Posté : mar. 09 mai 2023, 02:06
par N3ige
Je ne sais pas si tu en as encore besoin, mais une solution simple serait la suivante:

Tu initialises un tableau T de n (par exemple n=21 ou n=43) valeurs tout à 0.

Puis à chaque tirage, tu lances le script suivant :
1) Tirer une valeur aléatoire v entre 0 et n-1
2) Si T[v] = 0 alors T[v] = 1 et retourner v
3) sinon revenir à l'étape 1)

Au niveau performance ce n'est pas parfait, mais ça reste très raisonnable puisqu'on est sur le problème du collectionneur. Il faudra en moyenne un peu moins de 200 tirages d'aléa pour le cas n=43