1. #1
    AFU
    AFU ist offline
    U-Labs Routinier
    Avatar von AFU
    Registriert seit
    19.11.2011
    Beiträge
    347
    Thanked 69 Times in 57 Posts

    Standard C#: Random für Zufallsbuchstabe erzeugt gleiches Ergebnis

    Hallo,

    wo liegt mein Fehler? Ich hätte gerne zufällig 36 Zeichen langen String, der sich aus dem angegeben String zufällig zusammensetzt. Was mache ich falsch?

    //Rextester.Program.Main is the entry point for your code. Don't change it.
    //Compiler version 4.0.30319.17929 for Microsoft (R) .NET Framework 4.5

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text.RegularExpressions;

    namespace Rextester
    {
    public class Program
    {
    public static void Main(string[] args)
    {
    //Your code goes here

    string zeichen = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz";

    int zufallsbuchstabe = 0;
    string final ="";


    for (int i=0; i<36; i++) {

    Random zufall = new Random();
    zufallsbuchstabe = zufall.Next(0, 51);


    final = final + zeichen.Substring(zufallsbuchstabe, 1);
    //int position = zeichen.IndexOf(zufallszahl);
    //final = zeichen.Substring(position, 1);



    }

    Console.WriteLine("Zufall! " + final );

    }
    }
    }
    Geändert von AFU (13.02.2018 um 00:20 Uhr)

  2. #2
    U-Labs Routinier
    Avatar von Nuebel
    Registriert seit
    23.11.2013
    Beiträge
    438
    Thanked 348 Times in 227 Posts

    Standard AW: C#: zufallsbuchstabe

    Was funktioniert denn da nicht?

    Habe keinen C#-Compiler zur Hand. Der folgende Code ist in Java und funktioniert:

    import java.util.Random;

    public class RandomString {
    public static void main(String[] args) {
    char[] alphabet = (
    "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
    + "abcdefghijklmnopqrstuvwxyz").toCharArray();

    final int alphabetLength = alphabet.length;

    Random random = new Random();

    final int length = 36;
    StringBuilder randomStr = new StringBuilder(length);

    for (int i = 0; i < length; ++i) {
    randomStr.append(alphabet[random.nextInt(alphabetLength)]);
    }

    System.out.println(randomStr.toString());
    }
    }

    Aufgrund der Ähnlichkeit zu C#, solltest du es übertragen können.

  3. The Following 2 Users Say Thank You to Nuebel For This Useful Post:

    AFU (15.02.2018), DMW007 (27.02.2018)

  4. #3
    Nachrichtendienst

    Registriert seit
    09.11.2011
    Beiträge
    102
    Thanked 118 Times in 39 Posts

    Standard AW: C#: zufallsbuchstabe

    Erzeuge das Random-Objekt mal außerhalb der for-Schleife (wie Nuebel es getan hat).

  5. The Following 3 Users Say Thank You to Brainy For This Useful Post:

    AFU (15.02.2018), DMW007 (27.02.2018), Nuebel (14.02.2018)

  6. #4
    U-Labs Elite
    Avatar von Manipulate
    Registriert seit
    04.12.2011
    Beiträge
    505
    Thanked 487 Times in 346 Posts

    Standard AW: C#: zufallsbuchstabe

    Könntest du nicht auch theoretisch
    final = final + zeichen.Substring(zufall, zufall+1);
    machen?

    edit:
    Ach Moment, hab länger nicht mehr mit random gearbeitet, weiß nicht mehr genau wie das funktioniert. xD
    Geändert von Manipulate (14.02.2018 um 15:24 Uhr)

  7. #5
    Nachrichtendienst

    Registriert seit
    09.11.2011
    Beiträge
    102
    Thanked 118 Times in 39 Posts

    Standard AW: C#: zufallsbuchstabe

    Zitat Zitat von Manipulate Beitrag anzeigen
    Könntest du nicht auch theoretisch
    final = final + zeichen.Substring(zufall, zufall+1);
    machen?

    edit:
    Ach Moment, hab länger nicht mehr mit random gearbeitet, weiß nicht mehr genau wie das funktioniert. xD
    Der zweite Parameter bei der Methode Substring (das gilt für die vom Fragestellenden benutze Programmiersprache C#) bestimmt die Anzahl (Länge) der Zeichen in der Teilzeichenfolge.

    Betrachten wir mal folgendes Beispiel:

    String abcde = "abcde";

    In C# liefert abcde.Substring(2,3) "cde".
    In Java liefert abcde.substring(2,3) "c".
    Geändert von Brainy (14.02.2018 um 17:23 Uhr)

  8. The Following 3 Users Say Thank You to Brainy For This Useful Post:

    DMW007 (27.02.2018), Manipulate (14.02.2018), Tistonedide (08.12.2018)

  9. #6
    U-Labs Routinier
    Avatar von Nuebel
    Registriert seit
    23.11.2013
    Beiträge
    438
    Thanked 348 Times in 227 Posts

    Standard AW: C#: zufallsbuchstabe

    Zitat Zitat von Brainy Beitrag anzeigen
    In C# liefert abcde.Substring(2,3) "cde".
    In Java liefert abcde.substring(2,3) "c".
    Ich hasse das, wenn man bei Methoden, die "Range-Argumente" entgegennehmen nicht sofort erkennen kann, ob die obere Schranke in- oder exklusiv ist.

  10. #7
    U-Labs Elite
    Avatar von Manipulate
    Registriert seit
    04.12.2011
    Beiträge
    505
    Thanked 487 Times in 346 Posts

    Standard AW: C#: zufallsbuchstabe

    @Brainy
    Achso, bin mit C# nicht vertraut, habe angenommen es wäre genauso wie in Java. Danke für die Aufklärung.

    Aber in dem Fall könnte man doch statt wie bei mir zufall+1 einfach 1 hinschreiben, hätte das nicht den selben Effekt?
    edit: oh, hat er getan, ich halte mich dann doch raus XD
    Geändert von Manipulate (14.02.2018 um 20:15 Uhr)

  11. #8
    AFU
    AFU ist offline
    U-Labs Routinier
    Avatar von AFU
    Registriert seit
    19.11.2011
    Beiträge
    347
    Thanked 69 Times in 57 Posts

    Standard AW: C#: zufallsbuchstabe

    Thx to all, speziell zu Nuebel und Brainy, der Tipp mit dem Erzeugen außerhalb der For-Schleife hat die Lösung gebracht

  12. #9
    Projektleitung
    Avatar von DMW007
    Registriert seit
    15.11.2011
    Beiträge
    4.005
    Thanked 8.301 Times in 2.480 Posts
    Blog Entries
    5

    Standard AW: C#: zufallsbuchstabe

    Ergänzend noch die Erklärung, warum die Variante aus dem Eingangspost nicht das erwartete Ergebnis bringt: Der Standardkonstruktor der Random-Klasse erzeugt einen Seed-Wert für die Zufallszahlen, der von der Systemuhrzeit abgeleitet werden. Es gibt auch eine Überladung, um einen eigenen Seed festlegen zu können. Die beste Lösung ist aber, wie schon hier vorgeschlagen, die Random-Instanz außerhalb der Klasse zu erzeugen. Nicht nur wegen des Seed-Problemes, sondern auch vom generellen Entwicklungsmuster und der Performance her: Die Variante des TE erzeugt für JEDEN Durchlauf der Schleife eine Objektinstanz, in dem Beispiel also 36 Stück. Das sind 35 mehr als nötig. In dem simplen Mini-Programm ist das zwar egal, aber bei größeren Programmen und komplexeren Klassen kann das schon was ausmachen. Vor allem bei Client-Server Anwendungen.

    Man sollte es generell vermeiden, Objekte in einer Schleife zu Instanzieren. Ein Klassiker sind z.B. Datenbankabfragen in einer Schleife. Da ist der Performance-Overhead noch viel schlimmer, vor allem wenn ein ORM dazwischen steckt. Möglicherweise ist das da dem Entwickler gar nicht bewusst, wenn er mit der Architektur noch nicht so vertraut ist. Wenn man so etwas tut, empfehle ich daher, noch mal darüber nachzudenken, ob das wirklich sein muss. In manchen Ausnahmefällen kann das sinnvoll sein. Oft ist es das aber nicht und verursacht die genannten Probleme.

    Dieses Verhalten der Random-Klasse von C# ist übrigens auch in der MSDN dokumentiert: https://msdn.microsoft.com/de-de/lib...v=vs.110).aspx


Ähnliche Themen

  1. Stecker einstecken erzeugt Funken
    Von Jokuu im Forum Internet und Technik
    Antworten: 1
    Letzter Beitrag: 13.10.2014, 23:25
  2. Zwei mal komplett gleiches Bewusstsein in 2 Personen
    Von Hydra im Forum Zwischenmenschliches
    Antworten: 4
    Letzter Beitrag: 28.10.2013, 23:09
  3. Vokabeltest: Gleiches Wort aus anderer Lektion
    Von Minecraft im Forum Bildung
    Antworten: 5
    Letzter Beitrag: 11.12.2012, 22:13
Diese Seite nutzt Cookies, um das Nutzererlebnis zu verbessern. Klicken Sie hier, um das Cookie-Tracking zu deaktivieren.

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150