1. #1
    Avatar von AFU
    Registriert seit
    19.11.2011
    Beiträge
    359
    Thanked 75 Times in 61 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
    Avatar von Nuebel
    Registriert seit
    23.11.2013
    Beiträge
    446
    Thanked 361 Times in 236 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

    Registriert seit
    09.11.2011
    Beiträge
    121
    Thanked 129 Times in 46 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
    Avatar von Manipulate
    Registriert seit
    04.12.2011
    Beiträge
    520
    Thanked 505 Times in 356 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

    Registriert seit
    09.11.2011
    Beiträge
    121
    Thanked 129 Times in 46 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
    Avatar von Nuebel
    Registriert seit
    23.11.2013
    Beiträge
    446
    Thanked 361 Times in 236 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
    Avatar von Manipulate
    Registriert seit
    04.12.2011
    Beiträge
    520
    Thanked 505 Times in 356 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
    Avatar von AFU
    Registriert seit
    19.11.2011
    Beiträge
    359
    Thanked 75 Times in 61 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
    Avatar von DMW007
    Registriert seit
    15.11.2011
    Beiträge
    6.080
    Thanked 9.118 Times in 2.995 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.