Autor Beitrag
Adabei Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 33



BeitragVerfasst: Mo 25.08.14 20:11 
ausblenden C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
for (int i = 0; i < 1; i++)
            {
                int zahl = r.Next(153);
                if (!myList.Contains(zahl))
                {
                    myList.Add(zahl);
                }
                else
                {
                    i--;
                }
            }


Diese Methode verwende ich jetzt;
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: Mo 25.08.14 20:24 
Dann definiere deine Variable einfach außerhalb der for-Schleife.
ausblenden C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
int zahl;
for (int i = 0; i < 1; i++)
    {
       zahl = r.Next(153);
       if (!myList.Contains(zahl)) myList.Add(zahl);
       else i--;
    }
int ergebnis = zahl + 5;

Aber guck dir mal meine Variante an. Dafür brauchst du keine (theoretische) Endlosschleife. Und eine For-Schleife ist hier nicht sehr sinnvoll. Überlege dir nochmal wie eine alternative Lösung aussehen könnte.

P.S.: Palladin wieso :D ?

_________________
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: Mo 25.08.14 20:36 
Tipp:

Schau dir nochmal den dritten Beitrag von Ralf an.
Da steht im Prinzip genau das drin, was du brauchst und die wahrscheinlich einzig sinnvolle, bzw. die beste Herangehensweise.


Weil die Sprache so heißt, das ist irgendwie kompisch wenn ich auf einen Beitrag von dir verweise :D
Adabei Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 33



BeitragVerfasst: Di 26.08.14 11:03 
user profile iconC# hat folgendes geschrieben Zum zitierten Posting springen:
Dann definiere deine Variable einfach außerhalb der for-Schleife.

Aber guck dir mal meine Variante an. Dafür brauchst du keine (theoretische) Endlosschleife. Und eine For-Schleife ist hier nicht sehr sinnvoll. Überlege dir nochmal wie eine alternative Lösung aussehen könnte.


Also dass habe ich auch schon gemacht, dass ich einfach die variablöe zahl als globale variable erstellt habe, aber wenn ich dass so mache, dann kommen die zahlen manchmal immer noch doppelt

deine variante ist zwar sehr gut, ist aber auch eine for-schleife drinnen;

@Palladin: ja werde ich machen
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: Di 26.08.14 11:12 
Ohne Schleife gehts nicht, man sollte aber auch die richtige Schleifen-Form für sein Vorhaben nutzen. Performance-Unterschiede gibt es auch kaum.
Grundsätzlich geht jedes Vorhaben auch in jeder Schleife, die frage ist nur, wie übersichtlich und angenehm zum lesen das ist.
Adabei Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 33



BeitragVerfasst: Di 26.08.14 11:26 
naja ich denke performence unterschiede gibt es bei 100 Zahlen nicht, und wenn dass das problem ist nehme ich halt nur 50.

aber ich probiere es nochmal und wenn ich keine lösung habe, dann bitte ich euch, mir das nochmals zu erklären, und sonst poste ich die lösung selbstverständlich
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 26.08.14 12:18 
@Adabei
Meine Schleife läuft aber genau 100x durch. Deine Schleife könnte theoretisch unendlich oft durchlaufen - wie Ralf Jansen es bereits gesagt hat.
Noch eine Frage: was verstehst du unter "global"? Wenn die Zahl außerhalb der Schleife, aber innerhalb der Methode definiert wird, ist sie NICHT global.

Und wegen Performance musst du dir bei solchen Sachen wirklich noch keine Gedanken machen (außer dass deine Schleife endlos laufen könnte :mrgreen:)

@Palladin: meinst du sowas :mrgreen::
Zitat:
user profile iconC# hat folgendes geschrieben:
ausblenden C#-Quelltext
1:
					

_________________
Der längste Typ-Name im .NET-Framework ist: ListViewVirtualItemsSelectionRangeChangedEventHandler
Adabei Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 33



BeitragVerfasst: Di 26.08.14 12:22 
so, ich denke ich habe die Lösung gefunden:

ausblenden C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
int a = r.Next(1100);
myList.Add(a);
if (!myList.Contains(a))
{
myList.Add(a);
}
else
{
a--;
}


und ich denke dass ich nach diesem Ausdruck mit a weiterarbeiten kann.

ich dachte globale Variable ist es, wenn ich so mache(also dass schreibe ich immer oberhalb vom konstruktor):
ausblenden C#-Quelltext
1:
private string alles;					


und nachher kann ich immer schreiben:

alles=.... und brauche nicht immer string alles in jeder methode deklarieren
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: Di 26.08.14 12:32 
Lass sie 1000 mal durch laufen und du kriegst es kaum mit.
Das sind DImensionen, da langweilt sich ein moderner PC einfach nur.


Globale Variablen werden außerhalb der Methoden in der Klasse deklariert.
Lokale Variablen liegen in der Methode und sind außerhalb nicht zugänglich.
Du solltest dir immer überlegen, wo du eine Variable brauchst und ob ein Parameter nicht sinnvoller ist, als eine globale Variable.


Was deinen Code angeht:
Was genau tut das?
Es erstellt eine Zufallszahl von 1 bis 100 und legt diese Zahl in myList ab.
Dann prüfst du, ob diese Zahl nicht drin steht (was definitiv nie der Fall sein wird) und fügst sie erneut hinzu, ansonsten wird 1 von der Zahl abgezogen.
Wo ist da der Sinn?

Du möchtest eine Reihe Zufallszahlen haben, die alle garantiert unterschiedlich sind.
Oder anders formuliert: Du hast eine Liste Zahlen und möchtest dort zufällig Zahlen raus holen, ohne zurück legen.
Die meiner Meinung nach beste (und vermutlich auch die schnellste) Herangehensweise hat Ralf oben genannt, warum versuchst du nicht, das umzusetzen?
C# hat dir den Code dafür gezeigt, du musst ihn nur noch anpassen (für mehrere Zahlen) und nutzen.



@C#:

Genau das und dieses "@C#" auch :D
Adabei Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 33



BeitragVerfasst: Di 26.08.14 12:56 
ok, habe ich mir fast gedacht...

ja, dass weiß ich eh;

ja, diesen Code habe ich auch schon mal probiert, verstehe ich auch was er macht, aber das funktioniert auch nicht, es kommen auch gleiche zahlen :nixweiss:
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: Di 26.08.14 13:06 
Welcher Code?
Adabei Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 33



BeitragVerfasst: Di 26.08.14 14:51 
den Code von C# habe ich genommen und mit meinen Zahlen und Varibalen ausgefüllt

ausblenden C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
            List<int> zufallszahlen = new List<int>();
            for (int i = 1; i < 100; i++)
            {
                zufallszahlen.Add(i);
            }
            int a = r.Next(1,zufallszahlen.Count);
            myList.Add(zufallszahlen[a]);
            zufallszahlen.RemoveAt(a);
            int b=5;
            int ergebnis=a+b;
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: Di 26.08.14 15:23 
Wie sollen da gleiche Zahlen kommen?
Du holst doch nur eine raus, nicht mehrere.

Oder hast du den ganzen Code in eine Schleife gepackt, die dann so oft durch läuft, wie du Zahlen haben willst?
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19313
Erhaltene Danke: 1747

W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: Di 26.08.14 15:24 
Die Liste musst du dir natürlich merken und nicht bei jedem Anfordern einer Zufallszahl neu erzeugen...
Adabei Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 33



BeitragVerfasst: Di 26.08.14 15:28 
user profile iconjaenicke hat folgendes geschrieben Zum zitierten Posting springen:
Die Liste musst du dir natürlich merken und nicht bei jedem Anfordern einer Zufallszahl neu erzeugen...


ja genau dass ist das Problem;

nein habe ich nciht in eine schleife gepackt, aber ich hab ja immer 1 Zahl zwischen 1-100 wenn ich auf dem Button klicke, und wenn ich dann nochmal auf den Button klicke durchläuft er diesen Code nochmals, also wird es neu erstellt(und dass darf wie janicke sagt naütlrich nicht sein)
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: Di 26.08.14 15:44 
Achso, ich bin davon aus gegangen, dass du dir die Zahlen erst einmal alle sammelst und dann auf einmal aus gibst.
Dann ließe sich das in einer Methode ohne globale Liste regeln.

Der Grund, weshalb das nicht sein darf, ist der, dass die Liste dir ja das Spektrum der Zahlen vor gibt, also der Topf, wo du die Zahlen heraus nimmst.
Wie der Topf, aus dem Lose bei irgendeinem Gewinnspiel heraus genommen werden.
Wenn du diesen Topf bei jeder neuen Ziehung erst einmal neu befüllst, ist natürlich klar, dass auch vorher schon einmal entfernte Zahlen wieder gezogen werden können.
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 26.08.14 15:54 
Wenn du mein Beispiel verwendest, musst du die Liste zufallszahlen global definieren. Die For-Schleife in meinem Beispiel packst du in den Konstruktor und gut ist. Dann sollte es laufen.

_________________
Der längste Typ-Name im .NET-Framework ist: ListViewVirtualItemsSelectionRangeChangedEventHandler
Adabei Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 33



BeitragVerfasst: Di 26.08.14 16:01 
danke funktioniert!
Svas99
Hält's aus hier
Beiträge: 3



BeitragVerfasst: Di 13.01.15 18:23 
Hallo alle miteinander :wave:
also zur info vorneweg mal, ich bin neu hier, also wenn ich schon am anfang einen blödsinn mache einfach direkt sagen bitte.
ich dachte mir, ich führe diesen thread weiter und öffne keinen neuen, da meine frage im prinzip die gleiche ist wie jene von diesem Thread.
und zwar habe ich mal gleich wie ihr es ihm gesagt habt, auch etwas programmiert:
ausblenden C#-Quelltext
1:
2:
3:
4:
for (int i = 0; i < 50; i++)
            {
                zufallszahlen.Add(i);
            }

Das, was Ihr da oben seht, habe ich wie C# meinte in den Konstruktor reinprogrammiert, dass verstehe ich ja auch noch es erzeugt eine liste namens zufallszahlen mit 50 zahlen.
So nun habe ich einen button, namnes nächste zufallszahl, wo folgendes von mir reinprogrammiert wurde:
ausblenden C#-Quelltext
1:
2:
3:
int zufallszahl = r.Next(1,zufallszahlen.Count);
            meineListe.Add(zufallszahlen[zufallszahl]);
            zufallszahlen.RemoveAt(zufallszahl);

Also ich verstehe diese Zeilen eig. ja auch noch. Es wird eine Zufallszahl erstellt zwischen 1 und 50(weil die liste ja 50 lang ist) und diese wird dann in der integer Variable zufallszahl gespeichert. In der zweiten Zeile dann wird in die Liste meineListe die zufallszahl reingespeichert. Und am Ende wird der Liste zufallszahlen diese Zahl gelöscht.
Nun zur meine Frage, im Prinzip die gleiche oder ähnliche wie die von Adabi, was muss ich tun, damit diese Zahl nicht noch einmal vorkommt?Wenn ich auf den Button nächste zufallszahl klicke, dann kommen einige andere Zahlen aber es sind doch noch immer viele identisch. Wieso funktionierts bei ihm und bei mir nicht?
glg
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: Di 13.01.15 19:38 
Vorweg: Ich habe überhaupt keinen Plan mehr, was wir vorher geschrieben haben und Lust, das zu lesen, habe ich auch keine :D
Das ist der Nachteil, wenn alte Threads weiter geführt werden, ich denke daher, ein neuer Thread ist besser, wenn du die Infos aus anderen Quellen, auf die du dich beziehst, erklärst.


Zum Code:
Bedenke, dass der Computer immer bei 0 anfängt zu zählen, nie bei 1. Es gibt A-Programmiersprachen, die umgehen das, damit der Programmierer bei 1 anfangen kann, die breite Masse hält sich aber an die Konvention: Zählbeginn ist 0.
Soll heißen: Eine Liste mit 50 Items hat einen Index-Bereich von 0 bis 49.
Dass das bei dir keine IndexOutOfRangeException geworfen hat, war reines Glück.

Was dein Zufallszahlenproblem angeht, kann ich keinen Fehler entdecken.
Da kann keine Zahl doppelt auftreten, da jede ausgewählte Zahl auch direkt aus der Quell-Liste entfernt wird.
Eventuell hast du einen Fehler wo anders, z.B. beim Anzeigen der Zahlen?
Vielleicht hast du aber auch den Fehler gemacht, den jaenicke anspricht:
Zitat:
Die Liste musst du dir natürlich merken und nicht bei jedem Anfordern einer Zufallszahl neu erzeugen...



Allgemein noch zwei Tipps:
1.
Überdenke deine Namen genau. Die Variable "zufallszahl" ist zwar eine Zufallszahl, in deinem Kontext verwendest du sie aber nicht als Solche, sondern als zufälligen Index. Eventuell reicht auch einfach nur "index", weil die Herkunft eigentlich ziemlich egal für den Rest des Codes ist.
Die Liste "zufallszahlen" ist auch keine Liste mit Zufallszahlen, sondern nur einfachen Zahlen, die ursprünglich nur hoch gezählt wurden. Außerdem (so wie ich es verstanden habe) verwendest du sie nicht als die Liste, wo deine Zufallszahlen drin sind, diese AUfgabe übernimmt "meineListe", oder? Also müsste "MeineListe" deine Zufallsliste sein. "zufallszahlen" dagegen ist deine Quell-Liste, da du aus ihr die Zahlen auswählst, also würde ich sie auch so benennen. Eventuell ist es noch sinnvoll, im Namen mit einzufassen, dass die Zahlen in der Liste eindeutig sein müssen. Beispiel (auf Englisch):
"r" => "random" (heufig sehe ich auch einfach "rnd", ich bin aber ein Fan von ganzen Wörtern in Variablen)
"meineListe" => "randomNumbers" oder "selectedNumbers", da es ja auch ausgewählte Nummern sind
"zufallszahlen" => "sourceNumbers"
"zufallszahl" => "randomIndex" oder einfach nur "index"
Solche Regeln gestalten es sowohl den Helfern hier als auch dir selber, wenn du später mal deinen Code anschaust, deutlich einfacher, ihn zu verstehen. Ich merke teilweise schon während der Arbeit, dass ich in einzelne Code-Abschnitte ohne gut gewählte Namen nicht den Überblick behalten könnte.


2.
Schau mal hier vorbei. Ich habe den Vorgänger gelesen, das war ganz gut, erfordert aber Ausdauer, bringt dafür aber auch viel nötiges KnowHow für alles Weitere mit sich. Wenn du auch WinForms lernen willst, in der Version 2008 gibt es dazu aber auch noch Artikel. Besser wäre aber WPF, das kann genauso einfach eventbasiert arbeiten wie WinForms (auch wenn es das Potential um längen nicht ausschöpft), bringt darüber hinaus aber auch eine lange Liste sehr cooler Dinge mit sich.