2 votes

Randomiseur de chaîne

Une amie m'a demandé de faire un randomiseur de chaîne de caractères pour un jeu auquel elle joue. J'ai réussi à faire fonctionner le code mais maintenant elle veut que les caractères soient séparés tous les trois caractères par un tiret (ou un espace), mais je n'arrive pas à le faire fonctionner. Toute aide sera appréciée.

            For x As Integer = 1 To 10
                  strb.Append(chars(Int(Rnd() * UpperBound)))
          If x Mod 2 = 0 Then 
          strb.Append("-")

Les caractères doivent être séparés, mais comment éviter le tiret ajouté à la fin des caractères aléatoires ?

Merci les gars (et les filles) pour votre aide, ça marche.

2voto

Oded Points 271275

Il suffit d'ajouter un tiret (ou autre) tous les trois caractères :

For x As Integer = 1 To 5
  strb.Append(chars(Int(Rnd() * UpperBound)))
  If x Mod 3 = 0 Then      
    strb.Append("-")
  End If
Next

1voto

Tim Schmelter Points 163781

Comme je n'ai pas encore utilisé ces anciennes fonctions VB, je vais vous montrer comment le faire avec VB.NET qui peut aussi être converti en C# facilement :

Private Function RandomString(rnd As Random, size As Integer) As String
    Dim chars() As String = {"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", "0", "1", "2", "3", "4", "5", "6", "7", "8", "9"}
    Dim builder As New System.Text.StringBuilder()
    For i As Integer = 0 To size - 1
        builder.Append(chars(rnd.Next(0, chars.Length)))
    Next

    Return builder.ToString()
End Function

Générons une chaîne aléatoire de 5 caractères :

Dim rnd = New Random()
Dim rndString = RandomString(rnd, 5)

Notez que je passe l'instance aléatoire depuis. Si je la créais dans la méthode et que je l'appelais dans une boucle, elle générerait les mêmes chaînes de caractères puisque l'instance aléatoire n'est pas utilisée. Random utiliserait le même temps que les semences.

Editar : Je viens juste de voir que vous devez séparer le résultat. Vous pourriez utiliser une version surchargée :

Private Overloads Function RandomString(rnd As Random, size As Integer, separator As String, everyNChar As Int32) As String
    Dim builder = New System.Text.StringBuilder()
    Dim chars() As String = {"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", "0", "1", "2", "3", "4", "5", "6", "7", "8", "9"}
    For i As Integer = 0 To size - 1
        If i > 0 AndAlso i Mod everyNChar = 0 Then
            builder.Append(chars(rnd.Next(0, chars.Length))).Append(separator)
        Else
            builder.Append(chars(rnd.Next(0, chars.Length)))
        End If
    Next

    Return builder.ToString()
End Function

Notez que cela ne comptera pas les séparateurs.

0voto

AYK Points 2116

Vous pouvez utiliser des expressions régulières pour remplacer des chaînes de caractères. Il sera simple de modifier l'expression régulière et de gérer les demandes de modification :)

remplacez simplement TextBox1.Text = rndstring par :

TextBox1.Text = Regex.Replace(rndstring, "[a-zA-Z0-9]{3}", "$& ")

Notez que vous devez ajouter Imports System.Text.RegularExpressions si ce n'est pas déjà fait.

EDIT : J'ai donné la solution ci-dessus pour insérer un " " (espace blanc) après chaque troisième caractère. Si vous voulez un trait d'union (-), changez simplement la deuxième regex en "$&-"

0voto

Kratz Points 2895

Si je vous comprends bien, changez l'instruction if de If x Mod 2 = 0 Then a If x Mod 2 = 0 And x <> 10 Then . De cette façon, le tiret ne sera pas ajouté s'il se trouve sur le dernier élément.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X