Laden...

Bibliothek, mehrere getrennte Werte zurückgeben

Erstellt von Lizz4rd vor 6 Jahren Letzter Beitrag vor 6 Jahren 2.214 Views
L
Lizz4rd Themenstarter:in
8 Beiträge seit 2017
vor 6 Jahren
Bibliothek, mehrere getrennte Werte zurückgeben

Hallo!
Ich programmiere erst seit 1nem Monat C#. Zurzeit programmiere ich an einem Programm das zufällige Primzahlenpartner generiert. Diese Primzahlen möchte ich später noch getrennt voneinander verwenden.
Das Programm funktioniert einwandfrei (wenn auch ein wenig umständlich geschrieben). Danach habe ich eine Bibliothek erstellt das Programm dort hineingepackt und in einem Main aufgerufen.
Funktioniert ebenfalls --> ich bekomme dann als Ergebnis zum Beispiel 17,19 welche sich in einem String befinden --> wie löse ich jetzt also die Zahlen heraus.
Schon mal danke im voraus.


public static Tuple<int, int> Rdmprim(int r)
        {
            int y = 0;
            int a = 0;
            int b = 0;
            int z = 0;

            Random k = new Random();
            int w = k.Next(0, r); // Zufallszahl zwischen 0 und der Eingegebenen Zahl

            for (int i = 2; y <= 2; i++)
            {
                z = z + y;      //Wert um zu überprüfen ob a bereits einen Wert hat

                if (IstPrim(w) == true && y == 0)   //Primzahlgefunden und kein Wert in b
                {
                    a = w;
                    y++;
                }
                if (IstPrim(w) == true && z + i > i) //Primzahlgefunden und ein Wert in a
                {
                    b = w;
                    y++;
                    break;
                }
                else                          // Zufallszahl keine Primzahl --> +1
                {
                    w++;
                }
            }
            bool IstPrim(int x)     //Primzahlermittlung
            {
                x = w;

                for (int i = 2; i < Math.Sqrt(w) + 1; i++)
                {
                    if (w % i == 0)
                        return false;
                }
                return true;

            }
            return new Tuple<int, int>(a, b);
        }

16.807 Beiträge seit 2008
vor 6 Jahren

Dein Random erzeugt keine Zufallszahlen. Du verwendest Random falsch.
Warum: [FAQ] Random.Next liefert eine Zeit lang die gleiche Zufallszahl - Warum? Wie geht es richtig?

Ich verstehe die Frage nicht; wo willst Du was heraus lösen, und wo ist Dein String, den Du erwähnst?
Im Code sehe ich davon nichts.

Als Anfänger wäre es evtl. auch Hilfreich für die Übersicht nicht direkt Local Functions zu verwenden.
Das verwirrt Anfänger i.d.R; das nur als Tipp.

2.207 Beiträge seit 2011
vor 6 Jahren

Hallo Lizz4rd,

schau dir den Link von Abt mal an.

Weiter:

ich bekomme dann als Ergebnis zum Beispiel 17,19 welche sich in einem String befinden

das ist kein String, was du herausbekommst, sondern ein Tuple. Darin stehen zwei Werte, "Item1" und "Item2". Somit kannst du auf die zugreifen. Etwa so.

 
var a = Rdmprim(14);
int firstNumber = a.Item1;
int secondNumber = a.Item2;

Statt Tuples kann man auch eine Klasse verwenden. Wäre etwas schöner 😉

Gruss

Coffeebean

3.003 Beiträge seit 2006
vor 6 Jahren

Du willst für eine vorgegebene Zahl r zwei beliebige aufeinander folgende Primzahlen, die kleiner sind als [EDIT] eine zufällige Zahl, die kleiner ist als r[/EDIT]? Verstehe ich das richtig?

LaTino

"Furlow, is it always about money?"
"Is there anything else? I mean, how much sex can you have?"
"Don't know. I haven't maxed out yet."
(Furlow & Crichton, Farscape)

L
Lizz4rd Themenstarter:in
8 Beiträge seit 2017
vor 6 Jahren

Okay danke.
Sorry wegen der Sache mit dem String. Da habe ich mich wohl vertan 🤔.
Das werde ich mir mal ansehen.

L
Lizz4rd Themenstarter:in
8 Beiträge seit 2017
vor 6 Jahren

Dein Random erzeugt keine Zufallszahlen. Du verwendest Random falsch.

Bei mir sollen nur einmal eine Zufallszahl im Gesamten Program ausgegebn werden. Was es auch glaube ich tut, da jedes mal (wen ich das Program ausführe ) zwei andere Primzahlen angezeigt werden.

Mit herauslösen habe ich gemeint das ich im Main die Variable a und b ,die zurückgegeben werden, einzeln aufrufen kann um sie später bei einer Multiplikation zu verwenden.

Sry wegen der Sache mit dem String hab mich da vertan.

L
Lizz4rd Themenstarter:in
8 Beiträge seit 2017
vor 6 Jahren

Du willst für eine vorgegebene Zahl r zwei beliebige aufeinander folgende Primzahlen, die kleiner sind als [EDIT] eine zufällige Zahl, die kleiner ist als r[/EDIT]?

Ich habs eher so gemeint: Ich erzeuge eine Zufallszahl zwischen 0 und r. Dann uberprüfe ich ob diese eine Primzahl ist --> Nein --> Zufallszahl um eins erhöhen --> überprüfen
Wenn ich eine finde dann speichere ich diese in der Variable a ab.
Dan erhöhe ich wieder die Zufallszahl und speichere die nächste Primzahl in der Variable b ab.

16.807 Beiträge seit 2008
vor 6 Jahren

a) bitte unterlass die Full Quotes, ich hab keine Lust die dauernd zu entfernen
b) wenn Du auf zwei Quotes antworten willst, dann geht das auch in einem Beitrag
[Hinweis] Wie poste ich richtig?

3.003 Beiträge seit 2006
vor 6 Jahren

Du willst für eine vorgegebene Zahl r zwei beliebige aufeinander folgende Primzahlen, die kleiner sind als [EDIT] eine zufällige Zahl, die kleiner ist als r[/EDIT]?

Ich habs eher so gemeint: Ich erzeuge eine Zufallszahl zwischen 0 und r. Dann uberprüfe ich ob diese eine Primzahl ist --> Nein --> Zufallszahl um eins erhöhen --> überprüfen
Wenn ich eine finde dann speichere ich diese in der Variable a ab.
Dan erhöhe ich wieder die Zufallszahl und speichere die nächste Primzahl in der Variable b ab.

Dann lautet deine Aufgabe also:
"Finde für eine gegebene Zahl x eine zufällige Zahl r zwischen 0 und x, und gib die ersten beiden Primzahlen p0 und p1 aus, für die gilt: r ≤ p0 < p1."

Lagerst du das Erzeugen der Zufallszahl in den Kontext aus (was du tun solltest, denn, wie Abt sagt: so funktioniert Random nicht), bleibt übrig:

Tuple<int, int> FindPrimes(int startValue) (bzw mit den neuen Tupeln (int FirstPrime, int SecondPrime) FindPrimes(int startValue))

Der Pseudocode dafür sollte sein:


in einer Endlosschleife
    ermittle, ob der Zählwert eine Primzahl ist
    wenn ja und bereits eine Primzahl gespeichert wurde
        gib ein Tupel aus bereits gespeicherter Primzahl und dem Zählwert zurück, beende Funktion
    wenn ja und noch keine Primzahl gespeichert wurde
         speichere Zählwert als erste Primzahl
    erhöhe den Zählwert um eins

Tatsächlich ist die gesamte Methode auch nur 5 Zeilen lang und du brauchst nur eine einzige lokale Variable (statt 4). Schau dir dafür mal das hier an. Werd' außerdem die Inline-Methode los, in diesem Fall bringt die dich nur dazu, sie mehrfach aufzurufen: bedenke, dass bei jedem Aufruf von IstPrim() eine Schleife durchlaufen wird, die für sehr große Zahlen eine Weile brauchen wird. Jeder zusätzliche Aufruf dauert dann wieder...

Das wichtigste, um wirkliche Zufallszahlen zu erhalten, wäre aber, das Random aus deiner Methode zu verbannen.

LaTino

"Furlow, is it always about money?"
"Is there anything else? I mean, how much sex can you have?"
"Don't know. I haven't maxed out yet."
(Furlow & Crichton, Farscape)

L
Lizz4rd Themenstarter:in
8 Beiträge seit 2017
vor 6 Jahren

Tatsächlich ist die gesamte Methode auch nur 5 Zeilen lang und du brauchst nur eine einzige lokale Variable (statt 4). Schau dir dafür mal
>
an. Werd' außerdem die Inline-Methode los, in diesem Fall bringt die dich nur dazu, sie mehrfach aufzurufen: bedenke, dass bei jedem Aufruf von IstPrim() eine Schleife durchlaufen wird, die für sehr große Zahlen eine Weile brauchen wird. Jeder zusätzliche Aufruf dauert dann wieder...

Hört sich gut an. Danke für die Hilfe.

57 Beiträge seit 2012
vor 6 Jahren

Du kannst den String splitten mit der Methode Split(). Gib als Zeichen dann ',' an. Du bekommst so ein Array mit deinen Zahlen

OO gibts seit Platon - hatte der auch C#?

463 Beiträge seit 2009
vor 6 Jahren
  
  
                if (IstPrim(w) == true && y == 0)   //Primzahlgefunden und kein Wert in b  
                {  
                    a = w;  
                    y++;  
                }  
                if (IstPrim(w) == true && z + i > i) //Primzahlgefunden und ein Wert in a  
                {  
                    b = w;  
                    y++;  
                    break;  
                }  
                
  

Kleiner Tipp: du kannst hier == true weglassen und einfacher kürzer



                if (IstPrim(w) && y == 0)   //Primzahlgefunden und kein Wert in b
                {
                    a = w;
                    y++;
                }
                if (IstPrim(w) && z + i > i) //Primzahlgefunden und ein Wert in a
                {
                    b = w;
                    y++;
                    break;
                }
              

schreiben. Siehe auch [Tipp] Anfängerhinweis == true / == false

VG
Stefan