Page 1 sur 1

Mélanger aléatoirement une liste

Message non luPosté: 07 Oct 2019, 21:12
de wachil
J'ai deja ecris
local liste,i
liste[1]:=randint(1,14)
Pour i allant de 1 a 14
Tant que liste[i] appartient a liste
faire liste[i]:=randint(1,14)
Fin tant que
Finpour
Disp liste

Qql peut m'aider a modifier le appartient pour que je l'écrive sur la calculatrice s'il vous plait ?

Re: Mélanger aléatoirement une liste

Message non luPosté: 24 Nov 2019, 16:40
de Hamza.S
il existe une fonction countIf() qui compte le nombre de fois où elle croise un élément dans une liste

Re: Mélanger aléatoirement une liste

Message non luPosté: 25 Nov 2019, 11:27
de Bisam
Tout d'abord, contrairement à ce que dit ton titre, ton algorithme ne mélange pas la liste !
Il crée une liste qui est une permutation aléatoire des nombres de 1 à 14.

Deuxièmement, l'algorithme choisi est relativement inefficace !!
En effet, plus tu avances dans la liste, plus il devient difficile de trouver un nombre aléatoire qui n'ait pas encore été choisi. Pour seulement 14 éléments, il faudra en moyenne 45 tirages pour réussir à remplir la liste.

Pour faire mieux, il vaut mieux choisir le mélange de Fischer-Yates.

Ce qui est encore mieux est d'utiliser les fonctions disponibles pour ta calculette !! Tu peux trouver une bibliothèque nommée "numtheory" et dedans la fonction "randperm" fait exactement ce que tu souhaites.

Re: Mélanger aléatoirement une liste

Message non luPosté: 01 Déc 2019, 17:55
de PierreF8APV
Hello chers amis...
Je suis avec intérêt votre discussion car je débute avec le Ti-Basic (Ou tout au moins je ne l'ai pas approché depuis plus de 20 ans !), et je m'y recolle pour le plaisir.
J'ai tenté une traduction sous forme de fonction de l'algorithme de "Fisher-Yates", que je découvre grâce à vous. (Merci pour ça)
Alors évidemment, cet code est sans doute un peu grossier, voir buggé mais c'est bien pour ça que je m'intéresse à vos critiques (positives) et à aux améliorations possibles :
(C'est un code écrit sur une TI NSpire CXII CAS.)

Code: Tout sélectionner
Define fisheryates(liste)=
Func
  Local i,countliste,tmp,alea
  countliste:=dim(liste)
  For i,1,countliste
    alea:=randInt(1,countliste)
    tmp:=liste[alea]
    liste[alea]:=liste[i]
    liste[i]:=tmp
  EndFor
  Return liste
EndFunc


Remarque : Je n'ai pas trouvé de fonction dans le style de Swap(liste,indice départ, indice fin) qui permettrait de permuter deux éléments d'une liste... ça existe peut-être ?

Pierre

Re: Mélanger aléatoirement une liste

Message non luPosté: 01 Déc 2019, 18:29
de critor
Merci. :)

Je ne connais pas de fonction swap(), non.

Mais après, si c'est une opération fréquemment utilisée, il y a toujours la possibilité de la définir, au moins dans le classeur courant :
Code: Tout sélectionner
Define swap(l,i1,i2)
Func
  Local t
  t=l[i1]
  l[i1]:=l[i2]
  l[i2]:=t
  return l
EndFunc


Un appel possible serait alors liste:=swap(liste,3,7).

Définir la fonction en LibPub et enregistrer son classeur dans le dossier /MyLib/ permet de disposer des fonctions ainsi définies de manière globale, dans n'importe quel classeur donc.