Vous n'êtes pas identifié(e). Pour pouvoir écrire ou répondre à un message, vous devez vous connecter ou vous créer un compte sur JAWA.

#1 28-09-2020 16:22:43

Catmaya
Membre
Inscription : 14-04-2020

Chaîne aléatoire

Bonjour,

Je cherche à produire une chaîne aléatoire composée de 9 chiffres différents de 1 à 9.

J'ai hésité à mettre cette discussion dans Entraide ou Bug, parce que je ne sais pas d'où vient le problème.

Voici ce que je fais:

variable:VAR_I:0
variable:MACHAINE:T
  boucle:VAR_I<9
    variable:VAR_J:[_RAND:1:9]
       condition:MACHAINE!~{{VAR_J}}
          variable:MACHAINE:+{{VAR_J}}
          variable:VAR_I:+1
       condition:fin
  boucle:fin
message:Chaîne obtenue: {{MACHAINE}}

J'ai rajouté l'indentation pour la discussion.

J'initialise la variable MACHAINE avec un T pour que l'incrémentation aboutisse à une chaîne et pas à un calcul.

Je produits aléatoirement un chiffre de 1 à 9 que je place dans la variable VAR_J. Si la chaîne des nombres tirés ne contient pas encore ce chiffre, je le concatène à la variable MACHAINE, sinon, je boucle avec un nouveau chiffre. Quand j'ai mes 9 chiffres, j'affiche un message.

Celui-ci s'affiche instantanément avec le bon résultat. Mais le serveur demande d'attendre, le temps qu'il se synchronise, ce qui se fait au bout de quelques secondes.
Si j'appuie une deuxième fois sur le déclencheur, j'ai bien une nouvelle chaîne, mais le serveur affiche sans fin le message de synchronisation .

Est-ce qu'il y a une méthode plus simple pour produire cette chaîne (c'est le fait que les chiffres soient différents qui me pose problème) ?

Et pourquoi puisque mes instructions aboutissent à un résultat instantané et correct, le serveur continue à boucler sur je ne sais quoi ?

Brouillon id#3249.
Lieu de départ, déclencheur = bouton.

Merci.

Hors ligne

#2 28-09-2020 18:58:44

qc2m
Membre
Inscription : 09-03-2019

Re : Chaîne aléatoire

Bonjour,

Je viens de reproduire le problème et par la même occasion j'ai planté le serveur "Error 503 - Service Unavailable".
J'ai obtenu le message en lançant deux fois le script ci-dessus. Comme c'était bloqué, j'ai relancé la partie. Comme ça ne changeait rien, j'ai fermé mon navigateur. Je l'ai rouvert pour aller sur Jawa et j'ai eu le message d'erreur.
Je suis obligé de passé en navigation privée pour accéder au site.

Je vais réfléchir cette nuit à une autre solution. Peut-être initialiser une chaine (ou un tableau) avec tous les caractères possibles et retirer les caractères utilisés au fur et à mesure.
Je n'ai pas le temps ce soir de regarder le manuel pour traduire mon idée en jawascript

Exemple:
variable:CARACTERES_POSSIBLES:1|2|3|4|5|6|7|8|9

début de la boucle
VAR_J = random (1, nombre de cellules du tableau)
on prend la VAR_Jème cellule du tableau qu'on ajoute à la fin de MACHAINE
on supprime la VAR_Jème cellule du tableau
fin de la boucle

[Pour Z: J'arrive à nouveau à accéder à Jawa en navigation normale]

Bonne soirée.

Maxime (J'ai signé! ;) )

Hors ligne

#3 29-09-2020 06:42:35

Catmaya
Membre
Inscription : 14-04-2020

Re : Chaîne aléatoire

Oups ! Désolée Maxime.

C'est un peu ce que je voulais dire en disant que le serveur affichait sans fin le message. Il a fallu à chaque essai que je ferme le navigateur mais j'arrivais ensuite à me reconnecter.

C'est sympa de tenter de m'aider, merci.

J'avais tenté cette approche au départ, mais en fait elle est très similaire à celle que j'ai conservée.

En fait je n'ai pas besoin d'une chaine, c'est pour mettre ces chiffres dans un tableau. J'ai donc aussi essayé avec des conditions multiples, en comparant chaque tirage à 9 variables vides ou contenant un tirage.

Mais quelle que soit la méthode, le serveur s'emballe. Je ne sais pas si c'est le fait de placer une condition dans une boucle, si la boucle vit sa vie propre depuis que les objets lorgnent sur un comportement autonome, si le random entraîne des aleas en cascade inopinés, tout est possible sur Jawa !

Catherine

Hors ligne

#4 29-09-2020 11:43:55

qc2m
Membre
Inscription : 09-03-2019

Re : Chaîne aléatoire

Bonjour,

J'ai un tout petit peu progressé. Le code suivant affiche toujours le message de synchro avec le serveur mais n'est plus bloquant (on peut le lancer plusieurs fois)

variable:COMPTEUR:0
variable:CARACTERES_POSSIBLES:1|2|3|4|5|6|7|8|9
variable:MACHAINE:T

boucle:COMPTEUR<9
    variable:ALEATOIRE:[_RAND:0:8-{{COMPTEUR}}]
    variable:MACHAINE:+{{CARACTERES_POSSIBLES$ALEATOIRE}}
    variable:CARACTERES_POSSIBLE2:
    variable:SUPPR_TABLEAU:0
    boucle:SUPPR_TABLEAU<9
        condition:SUPPR_TABLEAU!~{{ALEATOIRE}}
            variable:CARACTERES_POSSIBLE2:+{{CARACTERES_POSSIBLES$SUPPR_TABLEAU}}|
        condition:fin
        variable:SUPPR_TABLEAU:+1
    boucle:fin
    variable:CARACTERES_POSSIBLES:{{CARACTERES_POSSIBLE2}}
    variable:COMPTEUR:+1
boucle:fin

Je continue de creuser...

Dernière modification par qc2m (29-09-2020 11:44:36)

Hors ligne

#5 29-09-2020 12:24:13

qc2m
Membre
Inscription : 09-03-2019

Re : Chaîne aléatoire

[quote=Catmaya]
Mais quelle que soit la méthode, le serveur s'emballe. Je ne sais pas si c'est le fait de placer une condition dans une boucle, si la boucle vit sa vie propre depuis que les objets lorgnent sur un comportement autonome, si le random entraîne des aleas en cascade inopinés, tout est possible sur Jawa !
[/quote]

Je ne pense pas que le random gène.
J'ai ce code chez moi qui tourne bien.
La différence avec le tien c'est que ma chaîne finale peut contenir plusieurs fois le même caractère

variable:TEMP:1
variable:PASSE_OK:
boucle:TEMP<6
variable:TEMP2:[_RAND:1:34]
variable:PASSE_OK:+[_CHAR:{{ALPHABET}}:{{TEMP2}}] // Ma variable ALPHABET contient 34 caractères
variable:TEMP:+1
boucle:fin

Hors ligne

#6 29-09-2020 12:51:26

Catmaya
Membre
Inscription : 14-04-2020

Re : Chaîne aléatoire

Merci qc2m,

J'étais en train de regarder le 1er code, mais j'ai bifurqué sur le second avec l'alphabet. Il a fallu que je passe par une variable intermédiaire contenant [_CHAR:{{ALPHABET}}:{{TEMP2}}] pour que ça fonctionne chez moi.

En fait c'est fonctionnel (à part que les caractères ne sont pas différents ;) ), mais le serveur fait toujours des siennes. En faisant varier la valeur de TEMP, on s'en rend compte. Jusqu'à 5, c'est instantané chez moi.
Ensuite, le résultat de la variable PASSE_OK est toujours mis à jour instantanément, mais le serveur nous dit de patienter.

J'ai essayé avec 100, le temps d'attente avant de reprendre la main est proportionnel. Mais ça ne plante pas.

J'ai mis en commentaires l'instruction modifiant la valeur de PASSE_OK, ça fait toujours pareil.

Ce qui est sûr, c'est que ce n'était pas la condition à l'intérieur de la boucle qui dysfonctionnait dans mon code initial.

J'ai l'impression que la boucle est un effet, et qu'il y a un temps imparti (1s ?)  à chaque passage.

Hors ligne

#7 29-09-2020 12:56:37

Catmaya
Membre
Inscription : 14-04-2020

Re : Chaîne aléatoire

Je viens d'essayer de mettre une Pause:0.1 avant boucle:fin, c'est rigolo parce qu'on voit bien les variables changer de valeur dans le debugger, mais c'est le seul intérêt parce qu'une fois que le traitement de la chaîne est terminé, le serveur boucle toujours.

Ça ralentit juste le processus.

Dernière modification par Catmaya (29-09-2020 12:59:33)

Hors ligne

#8 29-09-2020 13:13:35

Catmaya
Membre
Inscription : 14-04-2020

Re : Chaîne aléatoire

Par contre, toujours avec une boucle de 100, si on met
variable:TEMP2:5
au lieu du random, on obtient une chaine de 100 caractères identiques avec la 5ème lettre de ALPHABET, mais le serveur est beaucoup plus cool.

Hors ligne

#9 29-09-2020 13:18:31

Catmaya
Membre
Inscription : 14-04-2020

Re : Chaîne aléatoire

Pour continuer, avec:
variable:TEMP2:[(Math.random()* (10 - 1)) + 1]   ,

c'est instantané avec une boucle de 100. Et pas de manifestation du serveur.

On avance. Je vais essayer de remplacer le random de mes premiers essais.

Hors ligne

#10 29-09-2020 13:25:11

Catmaya
Membre
Inscription : 14-04-2020

Re : Chaîne aléatoire

En fait l'instruction exacte est:
variable:VAR_J:[Math.trunc((Math.random()* (10 - 1)) + 1)]

pour récupérer la partie entière.

Mais ça fooooonctionne !

Merci beaucoup.

Hors ligne

#11 02-10-2020 09:04:27

jawa
Admin

Re : Chaîne aléatoire

Hello
bon j'arrive après la bataille mais je suis content de voir que les solutions se trouvent sans moi !
Les erreurs 503 sont liées au fait que votre script génère une boucle infinie, et cela est surement du au fait que les variables aléatoires ne sont pas "retirées" côté serveur mais envoyées par le navigateur (qui a fait le tirage) pour être surs que les 2 côtés ont la même valeur aléatoire. Or dans la synchro serveur une interaction, seule la dernière valeur aléatoire est transmise côté serveur, donc dans ce cas très précis ou la variable aléatoire a changé N fois dans la boucle, c'est fichu.

Ensuite les erreurs de désynchro apparaissent si une condition est validée côté client mais pas serveur ce qui est le cas donc si les variables qui fondent la condition ont des valeurs désynchronisées des 2 côtés. cette double vérification par le serveur est en fait principalement un système anti triche un peu superflu pour les parties jouées en mode connecté. Vous pouvez le désactiver dan sles paramètres d'interface ("vérification des conditions côté serveur") pour éviter ces erreurs de désynchro.

De toute façon plus ça va plus je vais abandonner la synchro serveur des parties pour privilégier le système de persistence locale dans le navigateur (utilisé pour les standalones).

En effet pour faire ça suivant celle méthode il faut passer par un appel JS entre [ ] mais là aussi pas sûr qu'il soit bien synchronisé (donc souci si on interrompt/reprend la partie).

Sinon il n'y avait pas des solutions pure JAWA ? par exemple initialiser un tableau avec 10, 20 ou 30 chaines de 9 chiffres différentes précalculées (il y a des outils pour faire ça comme [url]https://onlinerandomtools.com/shuffle-letters[/url] ) et ensuite prendre la chaine dans une case aléatoire (je sais c'est moche d'un point de vue intellectuel mais ça peut largement suffire si le joueur n'est censé passer qu'une seule fois sur le puzzle)

Z

#12 02-10-2020 11:54:45

Catmaya
Membre
Inscription : 14-04-2020

Re : Chaîne aléatoire

Merci Z, même si j'avoue que je n'ai pas saisi toute la subtilité de la synchronisation et de l'asynchronisation.

Effectivement, j'avais songé à la dernière hypothèse qui était tout à fait possible à mettre en œuvre. Sauf que je ne connaissais pas ce genre de site et que produire ces chaines me demandait un effort de recherche pour un résultat effectivement peu plaisant.

J'ai préféré faire appel à la Communauté et qc2m m'a bien aidée à dérouler la bobine pour identifier puis contourner le point d'achoppement. Il n'y a pas une façon d'aboutir, et avoir plusieurs visions d'un problème augmente l'éventail des solutions.

Et je trouve que c'est bien qu'il reste sur ce forum des pistes et des explications que d'autres pourront suivre lors de recherches ultérieures.

Hors ligne

Pied de page des forums