Générer une chaà®ne aléatoire

id0ud0uid0ud0u Membre
02:30 modifié dans API AppKit #1
Encore une chose : est-il possible d'obtenir une phrase aléatoirement ?

Réponses

  • Philippe49Philippe49 Membre
    02:30 modifié #2
    Soit tu "randomize" le tirage au hasard d'une chaà®ne dans  une liste

    NSArray * strings= [NSArray arrayWithObjects:@&quot;Toto&quot;,@&quot;Titi&quot;,@&quot;Tutu&quot;,@&quot;Tata&quot;,nil];<br />NSString * randomString=[strings objectAtIndex:random()%[strings count]];
    


    Soit tu "randomize" tous les caractères :
    <br />NSString * string=[NSString stringWithFormat:@&quot;%c%c%%c%c&quot;,random()%26+&#39;a&#39;,random()%26+&#39;a&#39;,random()%26+&#39;a&#39;,random()%26+&#39;a&#39;];<br />
    


  • id0ud0uid0ud0u Membre
    02:30 modifié #3
    Et juste Pour informations : peux-tu m'expliquer :"random()%26+'a' " stp  ;)
  • NseaProtectorNseaProtector Membre
    02:30 modifié #4
    Random modulo 26 -> tirage au sort entre 0 et 26
    + a -> tu ajoutes a
    Tu obtiens un tirage au sort parmis les 26 lettres de l'alphabet.
  • AliGatorAliGator Membre, Modérateur
    02:30 modifié #5
    Avec un "%" en moins dans ton post plus haut (faute de frappe t'as mis "%%c" au lieu de "%c" à  taper trop vite :P), et la petite correction que random()%26 (un nombre entier psedo-aléatoire généré par random() passé au modulo 26) effectue un tirage au sort... entre 0 et 25 (et non 26) :P

    De plus, ne pas oublier d'initialiser le RNG en appellant srandom, typiquement en passant time(NULL) en paramètre de srandom, pour générer un seed pseudo-aléatoire lui-aussi, du moins différent à  chaque appel : [tt]srandom(time(NULL))[/tt]
  • AliGatorAliGator Membre, Modérateur
    02:30 modifié #6
    Allez, en cadeau, une petite catégorie pour générer une NSString aléatoire composée d'un nombre aléatoire de caractères pris dans le jeu de caractères ascii imprimables (des codes ascii 32 à  126) :
    @interface NSString (random)<br />+(id)randomStringWithLengthRange:(NSRange)range;<br />@end<br /><br />@implementation NSString (random)<br />+(id)randomStringWithLengthRange:(NSRange)range<br />{ <br />&nbsp; int i;<br />&nbsp; int len;<br />&nbsp; char* out;<br /><br />&nbsp; srandom(time(NULL));<br />&nbsp; len&nbsp; = range.location + random() % (range.length+1);<br />&nbsp; NSMutableData* buffer = [[NSMutableData alloc] initWithCapacity:len];<br />&nbsp; <br />&nbsp; out = [buffer mutableBytes];<br />&nbsp; for(i=0;i&lt;len;i++) out[i]=(char)(32+random()%(127-32));<br />&nbsp; self = [NSString stringWithCString:out encoding:NSASCIIStringEncoding];<br />&nbsp; [buffer release];<br /><br />&nbsp; return self;<br />}<br />@end<br />
    
  • NseaProtectorNseaProtector Membre
    02:30 modifié #7
    dans 1243979081:

    et la petite correction que random()%26 (un nombre entier psedo-aléatoire généré par random() passé au modulo 26) effectue un tirage au sort... entre 0 et 25 (et non 26) :P

    Oupps, tu as raison, ça aurait fait 27 lettres dans l'alphabet ! Merci Ali pour la précision et surtout pour la méthode, tiens je vais rajouter une heure dans la journée ce qui me laissera plus de temps pour apprendre cocoa...
  • Philippe49Philippe49 Membre
    02:30 modifié #8
    Une autre idée de catégorie

    -(NSString *) randomStringWithCharactersInCharacterSet:(NSCharacterSet*) characterSet;
  • AliGatorAliGator Membre, Modérateur
    02:30 modifié #9
    Héhé... figure toi que j'y ai bien pensé à  randomStringWithCharactersInCharacterSet... mais je suis curieux de voir comment tu vas l'implémenter... Parce que c'est la première chose à  laquelle j'ai pensé pour faire un truc propre... mais impossible de demander à  un NSCharacterSet son nombre d'éléments ni de lui demander un élément quelconque... Eh oui NSCharacterSet ne dérive pas de NSSet, mais de NSObject !

    Alors on pourrait tirer un nombre au hasard entre 0 et 2^16, correspondant à  un codepoint unicode, et vérifier qu'il est contenu dans le NSCharacterSet, si oui on l'ajoute à  notre chaà®ne random, sinon on passe et on réessaye... mais on risque fort de tomber sur beaucoup de cas où le caractère n'est pas dans le NSCharacterSet et donc beaucoup de "loupés"... du coup la génération de la chaà®ne risque de prendre du temps parce qu'on aura fait plein de tirages non confirmes au set...

    Ou alors demander la bitmapRepresentation du NSCharacterSet, puis compter le nombre de 1 (donc de caractères)... ensuite tirer un nombre entre 0 et ce nombre de caractères, et chercher dans la bitmapRep le n-ième caractère... tout aussi laborieux... tout ça pour une pauvre chaà®ne random ^^
  • Philippe49Philippe49 Membre
    02:30 modifié #10
    J'ai esssayé, parcourir les 8192 octets du bitmapRep et stocker les références des bits à  1 dans un tableau C prend moins d'un millième de secondes.
    Après on tire au hasard dans le tableau.
Connectez-vous ou Inscrivez-vous pour répondre.