-
13.02.2018, 00:09 #1
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)
-
13.02.2018, 11:26 #2
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.
-
The Following 2 Users Say Thank You to Nuebel For This Useful Post:
-
14.02.2018, 02:20 #3
- Registriert seit
- 09.11.2011
- Beiträge
- 126
Thanked 138 Times in 51 PostsAW: C#: zufallsbuchstabe
Erzeuge das Random-Objekt mal außerhalb der for-Schleife (wie Nuebel es getan hat).
-
-
14.02.2018, 15:21 #4
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. xDGeändert von Manipulate (14.02.2018 um 15:24 Uhr)
-
14.02.2018, 17:22 #5
- Registriert seit
- 09.11.2011
- Beiträge
- 126
Thanked 138 Times in 51 PostsAW: C#: zufallsbuchstabe
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)
-
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)
-
14.02.2018, 20:01 #6
-
14.02.2018, 20:14 #7
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 XDGeändert von Manipulate (14.02.2018 um 20:15 Uhr)
-
15.02.2018, 12:37 #8
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
-
27.02.2018, 20:27 #9
- Registriert seit
- 15.11.2011
- Beiträge
- 7.839
- Blog Entries
- 5
Thanked 9.358 Times in 3.198 PostsAW: 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
-
Stecker einstecken erzeugt Funken
Von Jokuu im Forum Internet und TechnikAntworten: 1Letzter Beitrag: 13.10.2014, 23:25 -
Zwei mal komplett gleiches Bewusstsein in 2 Personen
Von Hydra im Forum ZwischenmenschlichesAntworten: 4Letzter Beitrag: 28.10.2013, 23:09 -
Vokabeltest: Gleiches Wort aus anderer Lektion
Von Minecraft im Forum BildungAntworten: 5Letzter Beitrag: 11.12.2012, 22:13
Diese Seite nutzt Cookies, um das Nutzererlebnis zu verbessern. Klicken Sie hier, um das Cookie-Tracking zu deaktivieren.