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);
}
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.
- performance is a feature -
Microsoft MVP - @Website - @AzureStuttgart - github.com/BenjaminAbt - Sustainable Code
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
Microsoft MVP // Me // Blog // GitHub // @Egghead // All my talks // Speakerdeck
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)
Okay danke.
Sorry wegen der Sache mit dem String. Da habe ich mich wohl vertan 🤔.
Das werde ich mir mal ansehen.
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.
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.
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?
- performance is a feature -
Microsoft MVP - @Website - @AzureStuttgart - github.com/BenjaminAbt - Sustainable Code
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)
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.
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#?
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