Page 1 sur 1
[R] Prénoms aléatoires
Posté : lun. 20 janv. 2014 22:15
par sozary
Re bonjour!
Tout d'abord désolé pour ce re-message, mais je n'avais pas clairement énoncé mon problème et est rencontré des difficultés supplémentaires....
Je veux créer un générateur de prénoms pour mon jeu, ou l'utilisateur rentre le nombre min et max de caractère qu'il veux que son prénom comprenne.
Voici mon code:
► Afficher le texte
Code : Tout sélectionner
$file=FileOpen("prénom.txt",1)
dim $choix[26]=["a","b","c","d","e","f","g","h","i","j","k","l","m","n","o","p","q","r","s","t","u","v","w","x","y","z"]
$nbmax=6
$nbmin=3
$avancement=0
$string=0
$stringlen=0
while $stringlen<=$nbmax
$stringlen+=1
while $stringlen<$nbmax
for $h=0 to 26
$string=$choix[$h]
FileWriteLine($file,$string&@CRLF)
for $i=0 to $stringlen
$string&=$string[$h]
Next
FileWriteLine($file,$string&@CRLF)
Next
WEnd
WEnd
Il enregistre tous les résultats dans le fichier prénom.txt, et je voudrais qu'il répertorie tous les prénoms possibles, donc pour les valeurs nb min de caractères et nb max valant 3 et 6, cela devrait donner dans le fichier aaa, aab a la ligne 2, puis a la fin zzzzzz.
Or cela ne marche pas :/! Merci d'avance!
Re: [..] Prénoms aléatoires
Posté : lun. 20 janv. 2014 22:33
par jguinch
Un générateur de prénoms ...
J'imagine déjà le générateur de mot de passe, non ?
Re: [..] Prénoms aléatoires
Posté : lun. 20 janv. 2014 22:48
par sozary
Hum...........
Bon ok, mais franchement, je veux pas cracker reelement des mots de passe, mais je vais vous raconter une petite annectdote:
J avais telecharger une archive rar avec un mog de passe dessus, alors je me suis mis a chercher comment trouver ce mdp, alors j ai chercher comment hacker un mdp, et je suis tombé sur brute forve, de wikipedia. Alors j ai vus que sa mettrais problament des annees a cracker ce mot de passe. N ayant pas 60 ans de ma vie a passer sur une archive, je la supprima, mais je m interesse a comment afficher tous les caracteres possibles dans un interval donné. Mon tableau ferra alors $choix[62].
Si cela est illegal je comprendrais, mais je ne compte pas utiliser cette technique a mauvais estient.
Merci d avance!!
Re: [..] Prénoms aléatoires
Posté : lun. 20 janv. 2014 23:05
par mikell
Heu tu te rends compte de ce que tu vas obtenir ?
Voilà un exemple, qui n'utilise QUE les lettres A, B et C et qui ne donne QUE les résultats de 6 lettres
► Afficher le texte
Code : Tout sélectionner
$Form1 = GUICreate("Form1", 150, 310, 200, 100)
$List = GUICtrlCreateList("", 20, 20, 110, 250)
$label = GUICtrlCreateLabel("", 20, 280, 110, 20)
GUISetState()
Dim $text[3] = ["A", "B", "C"], $n = 0, $long = 6
_Vazi (0,"")
GUICtrlSetData($label, $n & " solutions")
While GUIGetMsg()<>-3
Wend
Func _Vazi ($temp, $string)
for $i = 0 to UBound($text)-1
if $temp < $long - 1 Then
_Vazi ($temp+1, $string & $text[$i] )
Else
GUICtrlSetData($List, $string & $text[$i] & "|")
$n += 1
EndIf
Next
EndFunc
Re: [..] Prénoms aléatoires
Posté : lun. 20 janv. 2014 23:45
par sozary
Ah! Et oui je savais, il y a 6^(62) possibilités pour un mot de passe de 6 caractère :/
Néanmoins merci pour ce code! J'ai apris que l'ont pouvait appeler sa fonction dans sa fonction

!
Merci!
Re: [R] Prénoms aléatoires
Posté : lun. 20 janv. 2014 23:52
par mikell
ça s'appelle la récursivité
Mais même si tu mets des limites : uniquement mots de 3 à 6 lettres comme ici
► Afficher le texte
Code : Tout sélectionner
$Form1 = GUICreate("Form1", 150, 310, 200, 100)
$List = GUICtrlCreateList("", 20, 20, 110, 250)
$label = GUICtrlCreateLabel("", 20, 280, 110, 20)
GUISetState()
Dim $text[3] = ["A", "B", "C"], $n = 0, $long = 6
_Vazi (0,"")
GUICtrlSetData($label, $n & " solutions")
While GUIGetMsg()<>-3
Wend
Func _Vazi ($temp, $string)
For $i = 0 to UBound($text)-1
If $temp<$long Then
_Vazi ($temp+1, $string & $text[$i] )
If StringLen($string)>1 Then
GUICtrlSetData($List, $string & $text[$i] & "|")
$n += 1
EndIf
EndIf
Next
EndFunc
si tu augmentes le nombre de lettres Autoit va planter et te mettre un beau message d'erreur
Error: Recursion level has been exceeded - AutoIt will quit to prevent stack overflow.
Re: [..] Prénoms aléatoires
Posté : mar. 21 janv. 2014 00:06
par jchd
sozary a écrit :Et oui je savais, il y a 6^(62) possibilités pour un mot de passe de 6 caractère
Que nenni, seulement 26^6 = 308915776 pour {a, b, c, ..., z} et 62^6 = 56800235584 pour {a,b,c,...,z,A,B,C,...,Z,0,1,2,...,9}
6^62 = 1759452407304813269615619081855885739163790606336, c'est pour 62 caractères dans {1,2,3,4,5,6}
Re: [R] Prénoms aléatoires
Posté : mar. 21 janv. 2014 00:14
par sozary
Oui, j ai un peu modifier le code a des valeurs apparement extreme, mais autoit n aime pas trop sa! Et puis de toute façon, c etait juste a but instructif, je me fiche que le code soit fonctionnel, je veux savoir au moins comment il marche! (apres je dis pas que c est naze si il marche en plus

)! Merci de cette petite (ou grande) modification sur le nb de possibilitées!
Re: [R] Prénoms aléatoires
Posté : mar. 21 janv. 2014 00:27
par sozary
Alors juste Mickel, s il te plaît, pourrais tu juste m expliquer ton code svp, car j' avoue ne pas comprendre a partir du moment ou tu utilise justement la récursivitée (de manière qu un débutant comme moi comprenne svl

!)
Merci d avance!
Re: [R] Prénoms aléatoires
Posté : mar. 21 janv. 2014 10:41
par Tlem
Bonjour. Le titre de ce sujet est "Prénoms aléatoires". De plus, il est indiqué ceci :
Je veux créer un générateur de prénoms pour mon jeu, ou l'utilisateur rentre le nombre min et max de caractère qu'il veux que son prénom comprenne.
La création d'un mot contenant une suite de caractère ne peux pas être considéré comme un
générateur de prénoms aléatoire. Je vois très mal quelqu'un ce faire appeler "Wxtahvoq" par exemple. ^^
Donc le mieux serait sans aucun doute de choisir au hasard dans une liste, par rapport aux critères sélectionnés.
Voici un code d'exemple utilisant le fichier csv disponible
ici :
► Afficher le texte
Code : Tout sélectionner
#include <ButtonConstants.au3>
#include <ComboConstants.au3>
#include <GUIConstantsEx.au3>
#include <StaticConstants.au3>
#include <WindowsConstants.au3>
Global $PFile = "Liste des prénoms 2004-2012.csv"
If Not FileExists($PFile) Then
MsgBox(16, "Erreur", "Le fichier des prénoms n'a pas été trouvé. Fin du programme.")
Exit
EndIf
Global $aFPrenoms = FileReadToArray($PFile)
Global $aListePrenoms[UBound($aFPrenoms)][2]
$aListePrenoms[0][0] = UBound($aFPrenoms)
Global $Timeout = 10
; On met en Tableau en ne gardant que le sexe et le prenom.
For $i = 1 To UBound($aFPrenoms) - 1
$aInfos = StringSplit($aFPrenoms[$i], ";")
$aListePrenoms[$i][0] = $aInfos[3]
$aListePrenoms[$i][1] = $aInfos[1]
Next
GUICreate("", 308, 186, -1, -1)
Global $Genre1 = GUICtrlCreateRadio("Masculin", 24, 64, 73, 17)
GUICtrlSetState(-1, $GUI_CHECKED)
Global $Genre2 = GUICtrlCreateRadio("Féminin", 24, 96, 73, 17)
Global $CMin = GUICtrlCreateCombo("2", 136, 88, 41, 25, BitOR($CBS_DROPDOWN, $CBS_AUTOHSCROLL))
GUICtrlSetData(-1, "2|3|4|5|6|7|8|9")
Global $CMax = GUICtrlCreateCombo("20", 224, 88, 41, 25, BitOR($CBS_DROPDOWN, $CBS_AUTOHSCROLL))
GUICtrlSetData(-1, "2|3|4|5|6|7|8|9|10|11|12|13|14|15|16|17|18|19|20")
GUICtrlCreateLabel("Longueur Mini", 120, 64, 71, 17)
GUICtrlCreateLabel("Longueur Maxi", 208, 64, 74, 17)
GUICtrlCreateLabel("Choix d'un prénom :", 72, 8, 162, 24)
GUICtrlSetFont(-1, 12, 800, 0, "MS Sans Serif")
Global $Go = GUICtrlCreateButton("Go", 72, 152, 75, 25)
Global $Annuler = GUICtrlCreateButton("Annuler", 160, 152, 75, 25)
GUISetState(@SW_SHOW)
While 1
$nMsg = GUIGetMsg()
Switch $nMsg
Case $GUI_EVENT_CLOSE, $Annuler
Exit
Case $Go
Local $Genre = "", $Min = 2, $Max = 20, $Choix = "", $ListChoix = ""
; On récupère le genre souhaité
If BitAND(GUICtrlRead($Genre1), $GUI_CHECKED) = $GUI_CHECKED Then
$Genre = "M"
Else
$Genre = "F"
EndIf
; On récupère les valeurs Min et Max
$Min = GUICtrlRead($CMin)
$Max = GUICtrlRead($CMax)
Local $Timer = TimerInit() ; Timer pour règler la durée du timeout de traitement
While 1
$Choix = Random(1, UBound($aListePrenoms) - 1, 1)
If StringInStr($ListChoix, $Choix) Then ContinueLoop ; Pour éviter de reprendre le même choix
$ListChoix &= "|" & $Choix
Local $PLong = StringLen($aListePrenoms[$Choix][1])
If StringInStr($aListePrenoms[$Choix][0], $Genre) Then
If $PLong >= $Min And $PLong <= $Max Then
MsgBox(64, "Prénom", "Prénom choisit : " & $aListePrenoms[$Choix][1] & @TAB)
ExitLoop
EndIf
EndIf
; Test du TimeOut
If Int(TimerDiff($Timer)/1000) > $Timeout Then
MsgBox(16, "Erreur", "Timeout de traitement atteind. Veuillez recommencer avec des critères moins restrictifs.")
ConsoleWrite($ListChoix & @CRLF)
ContinueCase
EndIf
WEnd
EndSwitch
WEnd
Si la liste devient trop conséquente, il est aussi possible de passer par 2 fichiers de prénoms (un de garçon et un de fille) et de choisir le bon fichier au départ. J'ai essayé avec un fichier de 200000 prénoms masculin/feminin et les temps de traitement me paraissent plus qu'acceptables (4 secondes sur mon pauvre C2D pour initialiser le tableau principal).
Re: [R] Prénoms aléatoires
Posté : mar. 21 janv. 2014 12:03
par jguinch
@Tlem : tu n'as pas lu son
deuxième post ?
sozarya a avoué ce dont il avait réellement besoin...
On n'est quand même pas trop dans le légal, là hein...
Sinon, pour la fonction, on pouvait le faire aussi sans récursivité...
Un petite fonction, différente de _ArrayCombinations, puisqu'elle réutilise les caractères plusieurs fois (donc permet d'avoir aaa).
► Afficher le texte
Code : Tout sélectionner
#include <Array.au3>
Local $aCombi = _DataCombinations("abcdef", 5)
_ArrayDisplay($aCombi)
; #FUNCTION# ====================================================================================================================
; Name ..........: _DataCombinations
; Description ...: Returns an array of all possible combinations of a string or array
; Syntax ........: _DataCombinations($vData, $iLen)
; Parameters ....: $vData - Data to use for combinations (can be a string or a 1D array)
; $iLen - Length of the combination.
; Return values .: An array of the whole combinations
; Author ........: JGUINCH
; ===============================================================================================================================
Func _DataCombinations($vData, $iLen)
Local $aData = $vData, $k, $iIndex, $iTemp
If IsString($vData) Then $aData = StringRegExp($vData, "(.)", 3)
Local $iSize = UBound($aData) ^ $iLen
Local $aResult[$iSize]
For $x = $iLen To 1 Step -1
$iIndex = 0
$iTemp = 0
$n = Ubound($aData) ^ ( $x - 1)
For $i = 1 To $iSize
If $iTemp = $n Then
$iTemp = 0
If $iIndex = UBound($aData) - 1 Then
$iIndex = 0
Else
$Iindex += 1
EndIf
EndIf
$aResult[$i - 1] &= $aData[$iIndex]
$iTemp += 1
Next
Next
Return $aResult
EndFunc
Re: [R] Prénoms aléatoires
Posté : mar. 21 janv. 2014 13:27
par sozary
Oui, j'avais dit un generateur de prenom, mais c'etait une couverture

!
Merci pour cette fonction _array, je testerais ce soir en rentrant chez moi!
Re: [R] Prénoms aléatoires
Posté : mar. 21 janv. 2014 13:43
par mikell
Tlem a écrit :Je vois très mal quelqu'un ce faire appeler "Wxtahvoq" par exemple.
Tu es contre les prénoms mayas ?
Mais bah ... "Tlem", "jguinch" et "mikell" ne figurent pas non plus dans le csv ^^
jguinch a écrit : pour la fonction, on pouvait le faire aussi sans récursivité.
Bien sûr mais c'est moins rigolo

Re: [R] Prénoms aléatoires
Posté : mar. 21 janv. 2014 15:59
par Tlem
mikell a écrit :Mais bah ... "Tlem", "jguinch" et "mikell" ne figurent pas non plus dans le csv
C'est sur, mais ce ne sont pas des prénoms, mais des pseudos ...
Et puis, qui te dit que "Wxtahvoq" est un prénom d'origine Maya ?
En tout cas,
Gogol ne connait pas, ni les principaux moteurs de recherche que je connais. Par contre, je n'ai pas trouvé le moteur de recherche Maya. C'est ptet ça ... Si tu as le lien, ce serait cool.

Re: [R] Prénoms aléatoires
Posté : mar. 21 janv. 2014 17:56
par sozary
Vous disputez pas

!
Je crois avoir compris, mais je crois pas avoir compris celle de la récursivité! Pourrais tu m'expliquer Mikell svp?

Re: [R] Prénoms aléatoires
Posté : mar. 21 janv. 2014 18:28
par jchd
Récursivité : n.f. propriété d'un fonctionnement récursif.
Récursif : adj. qualifie un fonctionnement doté de récursivité.
Re: [R] Prénoms aléatoires
Posté : mar. 21 janv. 2014 21:41
par mikell
Tlem a écrit : qui te dit que "Wxtahvoq" est un prénom d'origine Maya ?
MDR ... dire que j'hésitais entre maya et turc ... et ya même la recherche sur Google ^^
Décidément, entre le second degré qui a du mal à passer et les "explications" de jchd certes d'une limpidité cristalline mais néanmoins sybillines, on sent bien que c'est l'hiver
@sozary
Voilà le code commenté, mais faudra quand même cravacher tes neurones
► Afficher le texte
Code : Tout sélectionner
GUICreate("test", 150, 310, 200, 100)
$List = GUICtrlCreateList("", 20, 20, 110, 250)
$label = GUICtrlCreateLabel("", 20, 280, 110, 20)
GUISetState()
Global $text[3] = ["A", "B", "C"], $n, $long = 6 ; longueur max de la chaine
_Vazi (0,"")
GUICtrlSetData($label, $n & " solutions")
While GUIGetMsg()<>-3
Wend
Func _Vazi ($temp, $string) ; au 1er lancement $temp=0 et $string=""
For $i = 0 to UBound($text)-1 ; parcourt l'array $text
If $temp < $long Then
_Vazi ($temp+1, $string & $text[$i] ) ; incrémente $temp, rajoute la lettre à $string et relance la fonction
GUICtrlSetData($List, $string & $text[$i] & "|") ; écrit dans l'edit $string + la lettre
$n += 1 ; incrémente $n
EndIf
Next
EndFunc
Re: [R] Prénoms aléatoires
Posté : mar. 21 janv. 2014 22:37
par Tlem
J'avais parfaitement compris le second degré . . . Je cherchais Juste à te taquiner comme tu sait si bien le faire. ^ ^
Re: [R] Prénoms aléatoires
Posté : mar. 21 janv. 2014 22:48
par mikell
Re: [R] Prénoms aléatoires
Posté : mar. 21 janv. 2014 22:57
par sozary
Bah là, sa a le mérite d etre clair! C etait juste le _Vasy dans le _Vasy qui m avais posé problème!!
Merci neanmoins a tous de m'avoir aidé! Je promets de ne pas utiliser vos aides pour de mauvaises intentions, d ailleur je suis deja sur autre chose! Merci quand meme a jchd pour sa definition, qui m a je crois révelé le sens de la vie

.
Bonne continuation!!