Autor Beitrag
_daff_
Hält's aus hier
Beiträge: 4



BeitragVerfasst: Do 20.05.10 16:39 
Hallo,

ich hab ein kleines Problem und komm einfach nicht drauf. Ich versuch mit dem unten angeführten Code ein
Array mit 4 zufälligen Werten zu erstellen. Leider bekomm ich immer nur 4 gleiche Werte zurück. Ich komm echt
nicht drauf warum -- vielleicht kann mir jemand einen tipp geben. Danke.


ausblenden volle Höhe 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:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
55:
56:
57:
using System;
using System.Collections.Generic;
using System.Text;

namespace RandomExample
{
    // class for the random values
    class RandomValue
    {
        //---------------------------------------------------------------------
        public Random randValue;

        //---------------------------------------------------------------------
        public RandomValue()
        {
            randValue = new Random();
        }

        //---------------------------------------------------------------------       
        public int getValue()
        {
            return randValue.Next(110);
        }

    }
    
    class Randomizer
    {
        //---------------------------------------------------------------------
        public RandomValue[] myValue = new RandomValue[4];

        //---------------------------------------------------------------------
        public Randomizer()
        {
            myValue[0] = new RandomValue();
            myValue[1] = new RandomValue();
            myValue[2] = new RandomValue();
            myValue[3] = new RandomValue();

            Console.WriteLine("Random Values -------------------------------------");
            Console.WriteLine("Random 1: " + Convert.ToString(myValue[0].getValue()));
            Console.WriteLine("Random 2: " + Convert.ToString(myValue[1].getValue()));
            Console.WriteLine("Random 3: " + Convert.ToString(myValue[2].getValue()));
            Console.WriteLine("Random 4: " + Convert.ToString(myValue[3].getValue()));
        }
    }


    class Program
    {
        //---------------------------------------------------------------------
        static void Main(string[] args)
        {
            Randomizer myRand = new Randomizer();
        }
    }
}


Moderiert von user profile iconChristian S.: C#-Tags hinzugefügt
JasonDelife
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 81

Windows 7 Professional
C# (Visual Studio 2008 Professional), Java (NetBeans IDE 6.7)
BeitragVerfasst: Do 20.05.10 16:50 
Du darfst nicht mehrere Random-Objekte erstellen, sondern nur eins.

Grüße, JasonDelife.
danielf
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 1012
Erhaltene Danke: 24

Windows XP
C#, Visual Studio
BeitragVerfasst: Do 20.05.10 16:53 
Hallo und :welcome:,

das Problem ist, dass Random immer mit dem gleichen Wert initialisiert wird. Du legst in jeder Klasse ein neues Random-Objekt an (die sich deshalb untereinander nicht kennen). In der MSDN-Doku steht, dass wenn man den gleichen Seed-Wert verwenden man die gleiche Zahlenfolge bekommt.

D.h. du musst in deiner RandomValue-Klass bei der Erzeugung von Random einen unterschiedlichen Seed mitgeben. Den Seed wiederum könntest du von einer anderen Random Klasse bekommen. Dies ist aber sehr umständlich und auch unnötig, den du kannst über die RandomValue auch ein Random Objekt sharen (mit static).
ausblenden C#-Quelltext
1:
2:
3:
4:
class RandomValue
{
static Random randValue;
}


Dein Konstrukt an sich ist aber eher ungeschickt (wahrscheinlich lernst du geraden). Den generell kannst du alle auch short machen:
ausblenden C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
class Program
{
static void Main(string[] args)
{
Random randomizer = new Random();

int[] zahlen = new zahlen[4];

foreach(var zahl in zahlen)
{
 zahl = randomizer.GetValue();
}
}


Gruß

PS: Hier im Forum kannst du über Bereiche oder [ cs] und [/ cs] COde als solchen anzeigen.
_daff_ Threadstarter
Hält's aus hier
Beiträge: 4



BeitragVerfasst: Do 20.05.10 19:16 
Hallo danielf,

Danke für deine rasche Lösung und die Hinweise. Mir war nicht bewusst, das bei der Initialisierung immer der
gleiche Seed Wert verwendet wird.

Gruß
_daff_ Threadstarter
Hält's aus hier
Beiträge: 4



BeitragVerfasst: Do 20.05.10 19:20 
Hallo JasonDelife,

Danke für den Hinweis. Nach dem Durchlesen der Random-Class Doku, hätte ich vorher dem Posting machen sollen, war es klar.

Gruß
Kha
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 3803
Erhaltene Danke: 176

Arch Linux
Python, C, C++ (vim)
BeitragVerfasst: Do 20.05.10 19:52 
user profile icon_daff_ hat folgendes geschrieben Zum zitierten Posting springen:
Danke für deine rasche Lösung und die Hinweise. Mir war nicht bewusst, das bei der Initialisierung immer der gleiche Seed Wert verwendet wird.
Grundsätzlich wird der Seed vom parameterlosen Konstruktor zeitabhängig initialisiert. Wenn aber zwischen der Erzeugung zweier Instanzen keine messbare Zeit vergeht... ;)

_________________
>λ=