Autor |
Beitrag |
Svas99
Hält's aus hier
Beiträge: 3
|
Verfasst: Di 13.01.15 21:03
danke erstmals für die allgemeinen tipps:
das mit der namenswahl scheint bei vielen anfängern ein problem zu sein wenn ich mir die forenbeiträge so anschaue  , dafür entschuldige ich mich gleich mal und versuche es bei den nächsten fragen und programmen besser zu machen.
dass mit dem neuen forenbeitrag mache ich das nächste mal auch, danke für den tipp und entschuldigung dass ich hier weitergeschrieben habe, aber ich denke jetzt soll ich gleich hier weitermachen oder?
dass mit der for-schleife habe ich schon geändert und dass er immer bei 0 anfängt zu zähöen wusste ich, wusste aber nicht dass das zu problemen führen kann, danke für den tipp!!
welche Liste sollte ich mir da merken und was meint er damit?
meint er dass ich randomNumbers(also früher meineListe) auch woanders hinpacken sollte und nicht in den button nächste zufallszahl?
zur weiterverarbeitung: es ist nur mehr folgende Codezeile hier(diese Codezeile ist auch im Button nächste zufallszahl):
C#-Quelltext 1:
| m_lbausgabezufallszahlen.Items.Add(index.ToString()); |
wo könnte hier also das problem sein?
|
|
C#
      
Beiträge: 561
Erhaltene Danke: 65
Windows 10, Kubuntu, Android
Visual Studio 2017, C#, C++/CLI, C++/CX, C++, F#, R, Python
|
Verfasst: Di 13.01.15 22:15
Hallo,
@Palladin007
Eine IndexOutOfRange Exception wird er mit Sicherheit nicht bekommen. Random.Next() hat eine exklusive Obergrenze und keine inklusive. Das einzige was er nie bekommen wird, ist die 0.
@Svas99
Probiere es mal so:
Lege dir eine Liste direkt in der Klasse an und nicht in der Methode.
C#-Quelltext 1:
| List<int> rndNums = new List<int>(); |
Nun erzeugst du im Konstruktor die Zufallszahlen
C#-Quelltext 1: 2: 3:
| for (int i = 0; i < 50; i++) rndNums.Add(i); Random rnd = new Random(); rndNums.Sort((x1, x2) => rnd.Next(-1, 2)); |
Eine Zufallszahl holst du nun mit:
C#-Quelltext 1: 2:
| int randomNumber = rndNums[0]; rndNums.RemoveAt(0); |
_________________ Der längste Typ-Name im .NET-Framework ist: ListViewVirtualItemsSelectionRangeChangedEventHandler
|
|
Palladin007
      
Beiträge: 1282
Erhaltene Danke: 182
Windows 11 x64 Pro
C# (Visual Studio Preview)
|
Verfasst: Mi 14.01.15 00:46
Das mit der Obergrenze hab ich total vergessen - obwohl, ich verwechsle das eigentlich immer, wenn ich es nicht gerade nach lese
Dass die Liste in der Methode deklariert war, daran habe ich gar nicht gedacht, ich schäme mich -.-
Allerdings fand ich sein vorheriges System besser, als das "Durchwürfeln".
Zum Einen ist das in meinen Augen so ein gefaketer Zufall, die Zahlen stehen ja schon lange vor der ersten "Ziehung" fest.
Außerdem ist der Gesamt-Aufwand beim Auswählen der Zufallszahlen geringer, das würde beim Umfang des Codes auffallen.
Mein Favorit daher:
C#-Quelltext 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:
| public class Test { private readonly Random _random = new Random(); private readonly List<int> _numbers = new List<int>();
public Test() { ResetSource(); }
public void ResetSource() { _numbers.Clear(); for (int i = 0; i < 50; i++) _numbers.Add(i); }
public int TakeRandomNumber(bool removeNumber) { var randomIndex = _random.Next(0, _numbers.Count); var result = _numbers[randomIndex];
if (removeNumber) _numbers.RemoveAt(randomIndex);
return result; } } |
Ist vermutlich Geschmackssache, ich versuche dabei nur immer, möglichst wenig Code zu produzieren, ohne dass die Übersicht flöten geht. Ob mir das jetzt besser gelungen ist, können vermutlich Dritte besser bestimmen
PS @ Svas99:
Ein Random-Objekt nie niemals lokal deklarieren, außer du hast einen sehr guten Grund. Wenn du einen so guten Grund hast, sag mir bitte Bescheid, damit ich dich davon abbringen kann
Grund ist der, dass die Random-Klasse dann am besten sicher stellen kann, dass die Zahlen möglichst nahe an den Zufall heran kommen, wenn es die selbe Instanz ist. Ich würde sogar so weit gegen, global und statisch eine einzige Instanz im ganzen Programm zu nutzen, die sich dann nie ändert.
|
|
C#
      
Beiträge: 561
Erhaltene Danke: 65
Windows 10, Kubuntu, Android
Visual Studio 2017, C#, C++/CLI, C++/CX, C++, F#, R, Python
|
Verfasst: Mi 14.01.15 12:41
Okay dann hier zum Vergleich meine Version:
C#-Quelltext 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:
| class Test { private readonly Random random = new Random(); private readonly List<int> numbers = new List<int>();
public Test() { ResetSource(0, 50); }
public void ResetSource(int minimum, int maximum) { numbers.Clear(); for (int i = minimum; i < maximum; i++) numbers.Add(i);
numbers.Sort((n1, n2) => random.Next(-1, 2)); }
public int TakeRandomNumber() { if (numbers.Count == 0) throw new Exception("No more numbers in specified range left"); int num = numbers[0]; numbers.RemoveAt(0); return num; } } |
@Palladin
Ich weiß nicht on dein removeNumber Parameter wirklich Sinn macht, denn wenn du ihn auf false setzt, hast du nur eine umständliche Random.Next()-Funktion gebaut
Nachtrag:
Ich habe aus Spaß mal ein Performance Test der beiden Klassen gemacht. Das Resultat:
Ich gebe mich geschlagen Palladin007
Und hier nochmal mit meiner modifizierten Version ( int[], statt List<int> und OrderBy(), statt Sort()):
Und hier nochmal mit einer weiteren Modifikation meiner Seits (Zahlen manuell durchwürfeln und nicht mit Sort):
Palladin007 bei dir kam bei 100.000.000 Zahlen leider OutOfMemory. Bei mir kam die dann auch bei 1.000.000.000 Einträgen.
Einloggen, um Attachments anzusehen!
_________________ Der längste Typ-Name im .NET-Framework ist: ListViewVirtualItemsSelectionRangeChangedEventHandler
|
|
Palladin007
      
Beiträge: 1282
Erhaltene Danke: 182
Windows 11 x64 Pro
C# (Visual Studio Preview)
|
Verfasst: Mi 14.01.15 17:18
Setz mal Capacity auf 100 Millionen ^^
Du wirst fest stellen, die Performance wird besser und vielleicht verhindert das auch die OutOfMemory.
Warum die Exception kommt, weiß ich nicht, kann ich nur spekulieren.
Mein removeNumber-Parameter macht in dieser konkreten Situation vielleicht keinen Sinn, aber wenn dann der Inhalt der Quell-Liste nicht mehr aufgezählte Werte enthält, sondern irgendwelche anderen Werte, dann ist das gar nicht mehr so unpraktisch. Mir ging es dabei aber einfach nur darum, die STochastik zu simulieren, "Ziehen mit zurück legen" und "Ziehen ohne zurück legen".
Was die Performance angeht:
Sort ist aufwendig, da die ganze Liste mehrfach durchlaufen und umgewäzt werden muss.
Daher wird die meiste Zeit vermutlich die ResetSource-Methode brauchen. TakeRandomNumber ist daher vermutlich minnimal schneller, als bei mir, da kein zufälliger Index gewählt werden muss, der Rest aber gleich bleibt.
PS:
Du hast bei 1 Milliarde Zahlen dann auch eine OutOfMemory bekommen, weil das dann grob über den Daumen gerechnet 4 GB im RAM sind, das Maximum liegt aber bei 2 GB. Versuch mal 500 Millionen, bzw. etwas weniger, damit noch Platz für andere Inhalte bleibt.
|
|
Ralf Jansen
      
Beiträge: 4708
Erhaltene Danke: 991
VS2010 Pro, VS2012 Pro, VS2013 Pro, VS2015 Pro, Delphi 7 Pro
|
Verfasst: Mi 14.01.15 17:29
Zitat: | das Maximum liegt aber bei 2 GB. |
<gcAllowVeryLargeObjects> Element
Moderiert von Th69: URL-Titel hinzugefügt.
|
|
Svas99
Hält's aus hier
Beiträge: 3
|
Verfasst: Mi 14.01.15 18:26
danke für die vielen antworten!!!
ich habe mich für C#s-Methode entschieden, weil ich es so besser verstehe.
problem gelöst...
|
|
|