Autor Beitrag
Svas99
Hält's aus hier
Beiträge: 3



BeitragVerfasst: 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 :D , 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):
ausblenden C#-Quelltext
1:
m_lbausgabezufallszahlen.Items.Add(index.ToString());					

wo könnte hier also das problem sein?
C#
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 561
Erhaltene Danke: 65

Windows 10, Kubuntu, Android
Visual Studio 2017, C#, C++/CLI, C++/CX, C++, F#, R, Python
BeitragVerfasst: 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.
ausblenden C#-Quelltext
1:
List<int> rndNums = new List<int>();					


Nun erzeugst du im Konstruktor die Zufallszahlen
ausblenden C#-Quelltext
1:
2:
3:
for (int i = 0; i < 50; i++) rndNums.Add(i); // Zahlen von 0 bis einschließlich 49 in die Liste schreiben
Random rnd = new Random(); // Random generator erzeugen
rndNums.Sort((x1, x2) => rnd.Next(-12)); // Zahlenliste durcheinander würfeln


Eine Zufallszahl holst du nun mit:
ausblenden C#-Quelltext
1:
2:
int randomNumber = rndNums[0];
rndNums.RemoveAt(0);

_________________
Der längste Typ-Name im .NET-Framework ist: ListViewVirtualItemsSelectionRangeChangedEventHandler
Palladin007
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 1282
Erhaltene Danke: 182

Windows 11 x64 Pro
C# (Visual Studio Preview)
BeitragVerfasst: 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 :D

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:

ausblenden 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 :D



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#
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 561
Erhaltene Danke: 65

Windows 10, Kubuntu, Android
Visual Studio 2017, C#, C++/CLI, C++/CX, C++, F#, R, Python
BeitragVerfasst: Mi 14.01.15 12:41 
Okay dann hier zum Vergleich meine Version:
ausblenden 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(050);
        }

        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(-12));
        }

        public int TakeRandomNumber()
        {
            if (numbers.Count == 0throw 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 :D


Nachtrag:

Ich habe aus Spaß mal ein Performance Test der beiden Klassen gemacht. Das Resultat:
Bild

Ich gebe mich geschlagen Palladin007 :flehan:

Und hier nochmal mit meiner modifizierten Version (int[], statt List<int> und OrderBy(), statt Sort()):
Bild2

Und hier nochmal mit einer weiteren Modifikation meiner Seits (Zahlen manuell durchwürfeln und nicht mit Sort):
Bild3

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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 1282
Erhaltene Danke: 182

Windows 11 x64 Pro
C# (Visual Studio Preview)
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 4708
Erhaltene Danke: 991


VS2010 Pro, VS2012 Pro, VS2013 Pro, VS2015 Pro, Delphi 7 Pro
BeitragVerfasst: Mi 14.01.15 17:29 
Zitat:
das Maximum liegt aber bei 2 GB.

<gcAllowVeryLargeObjects> Element

Moderiert von user profile iconTh69: URL-Titel hinzugefügt.
Svas99
Hält's aus hier
Beiträge: 3



BeitragVerfasst: 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...