Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

ERROR

Alter Hase

  • »ERROR« ist der Autor dieses Themas

Beiträge: 417

Wohnort: Paderborn

Beruf: Informatik Student

  • Private Nachricht senden

1

21.03.2012, 21:57

C# mehrere Zufallszahlen

Hallihallo,

Zu Übung habe ich heute mal angefangen einen Rechentrainer, den wir in der Schule mal in VB gemacht haben, in C# zu programmieren. Leider stoss ich ziemlich schnell auf ein Problem, dass ich auch noch langer recherche nicht ordentlich lösen konnte.

Ich will 2(oder mehr) Zufallszahlen erzeugen, die aber NICHT gleich sind. Leider kommen bei all meinen versuchen immer 2 gleiche raus. Kann mir vielleicht juemand einen Tipp/Denkstanstoss/Beispielscode geben?

So sieht es bisher aus:

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
29
30
31
32
33
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;

namespace Rechentrainer_test
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }
        private int RandomNumber(int min, int max)
        {
            Random rnd = new Random();
            return rnd.Next(min, max);
        }

        private void btnStart_Click(object sender, EventArgs e)
        {
            int a = RandomNumber(1, 10);
            lbl1.Text = Convert.ToString(a);

            double b = RandomNumber(1,10);
            lbl2.Text = Convert.ToString(b);
        }
    }
}

2

21.03.2012, 22:00

Ich kenne mich in C# nicht aus, aber kann es sein, dass du den Zufallsgenerator ohne Seed verwendest und jedes mal in der Funktion neu initialisierst? Zufallszahlen des PC's sind nämlich nicht echt, sondern berechnet und benötigen daher einen Seed.

BlueCobold

Community-Fossil

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

3

21.03.2012, 22:01

Du hast da einen grundlegenden Fehler, nämlich den, dass Dein Generator vermutlich immer mit der selben Zahl initialisiert wird (der Zeit). Um das zu verhindern musst Du entweder eine Instanz halten, die mehrfach verwendet wird oder sie mit anderen Werten initialisieren.

Beispiel, was es eventuell schon lösen könnte:

C-/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
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;

namespace Rechentrainer_test
{
    public partial class Form1 : Form
    {
        Random rnd = new Random();

        public Form1()
        {
            InitializeComponent();
        }
        private int RandomNumber(int min, int max)
        {
            return rnd.Next(min, max);
        }

Übrigens macht die Methode "RandomNumber" keinen Sinn. Wieso? Weil "RandomNumber(0,15)" länger ist als "rnd.Next(0,15)". Wozu also solchen Quatsch kapseln?
Teamleiter von Rickety Racquet (ehemals das "Foren-Projekt") und von Marble Theory

Willkommen auf SPPRO, auch dir wird man zu Unity oder zur Unreal-Engine raten, ganz bestimmt.[/Sarkasmus]

4

21.03.2012, 22:02

Also im Prinzip genau das, was ich schrieb...

BlueCobold

Community-Fossil

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

5

21.03.2012, 22:04

Nicht ganz. Du bist teilweise davon ausgegangen, dass es kein Seed gibt. Das gibt es aber auch dann, wenn man nichts angibt, nämlich die Systemzeit.
Teamleiter von Rickety Racquet (ehemals das "Foren-Projekt") und von Marble Theory

Willkommen auf SPPRO, auch dir wird man zu Unity oder zur Unreal-Engine raten, ganz bestimmt.[/Sarkasmus]

Beiträge: 1 223

Wohnort: Deutschland Bayern

Beruf: Schüler

  • Private Nachricht senden

6

21.03.2012, 22:08

Du generierst immer wieder ein neues "Random"-Objekt und verwirfst es wieder.
Du musst dir die Instanz schon merken:

C#-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
private readonly Random Rnd = new Random();
public Form1()
{
    InitializeComponent();
}
private void btnStart_Click(object sender, EventArgs e)
{
    int a = Rnd.Next(1, 10);
    lbl1.Text = Convert.ToString(a);

    double b = Rnd.Next(1, 10);
    lbl2.Text = Convert.ToString(b);
}


Ganz nebenbei, du willst beim zweiten vermutlich auch Kommazahlen, sonst hättest du ja nicht "Double" da.
Momentan generierst du aber eine Ganzzahl und wandelst sie bloß in eine Gleitkommazahl um. Richtig wäre dann "Rnd.NextDouble() * 9.0d + 1.0d"

Edit: Da waren wohl welche schneller. ^^

Legend

Alter Hase

Beiträge: 731

Beruf: Softwareentwickler

  • Private Nachricht senden

7

22.03.2012, 11:24

Theoretisch hättest du zwei unterschiedliche Zahlen bekommen können, wenn zwischen den beiden Aufrufen von RandomNumber grad die Sekunde umspringt. Aber das ist sehr unwahrscheinlich! ;)
"Wir müssen uns auf unsere Kernkompetenzen konzentrieren!" - "Juhu, wir machen eine Farm auf!"

Netzwerkbibliothek von mir, C#, LGPL: https://sourceforge.net/projects/statetransmitt/

Sylence

Community-Fossil

Beiträge: 1 663

Beruf: Softwareentwickler

  • Private Nachricht senden

8

22.03.2012, 12:18

Hätte man auch durch einen kurzen blick in die Doku herausfinden können:

Zitat von »"http://msdn.microsoft.com/en-us/library/h343ddh9.aspx"«

As a result, different Random objects that are created in close succession by a call to the default constructor will have identical default seed values and, therefore, will produce identical sets of random numbers.

ERROR

Alter Hase

  • »ERROR« ist der Autor dieses Themas

Beiträge: 417

Wohnort: Paderborn

Beruf: Informatik Student

  • Private Nachricht senden

9

23.03.2012, 17:49

Vielen Danke Leute. Ich habe den ersten Lösungsvorschlag probiert und es hat sofort geklappt!

Endlich kann ich wieder schlafen :D

Dankeschön.

Werbeanzeige