[c#] Random() class gebruiken in methods

Pagina: 1
Acties:

  • mOrPhie
  • Registratie: September 2000
  • Laatst online: 20-08 15:04

mOrPhie

❤️❤️❤️❤️🤍

Topicstarter
Ik gebruik de Random() class om gerandomiseerde waardes op te halen. Echter lijk ik op een probleem te stuiten waar ik op zich wel uit ben, maar toch even een mening van een kenner van wil hebben ;)

Hetvolgende stukje code:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
using System;

namespace ConsoleApplication1
{
  class Class1
  {
    [STAThread]
    static void Main(string[] args)
    {
        Class1 test = new Class1();
        for( int i = 0; i <20; i++ ) {
            Console.WriteLine( test.GetValue() );
        }
        Console.ReadLine();
    }

    public string GetValue() {
        return new Random().Next( 3000, 70000000 ).ToString();
    }
  }
}


Geeft dit als output:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
28184185
8417736
8417736
8417736
8417736
66961807
66961807
66961807
66961807
66961807
66961807
66961807
66961807
66961807
66961807
66961807
66961807
66961807
66961807
66961807


Ik wil het random getal dus uit een method halen (omdat ik dus in mijn orginele applicatie meer wil gaan doen met dat getalletje dan alleen ophalen). Je ziet echter dat het randomizen niet helemaal goed gaat. Waarschijnlijk omdat ie het object (op dezelde tijd of tijdframe) opnieuw creëert en dus niks van zijn voorganger wist.

Als ik het namelijk zo doe:

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
using System;

namespace ConsoleApplication2
{
  class Class1
  {
    [STAThread]
    static void Main(string[] args)
    {
        Random r = new Random();
        for( int i = 0; i <20; i++ ) {
            Console.WriteLine( r.Next( 3000, 70000000 ) );
        }
        Console.ReadLine();
    }
  }
}


Dan is de output:

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
58596650
20666820
29993605
46628114
16667809
26807543
34353887
823170
10411522
23681616
68385263
9645560
41864623
8407746
69451014
34564774
11981610
55522792
1564718
40341006


Die is dus wel goed, maar da's niet zoals ik het wil dus. Nu kan ik in het eerste geval het Random() objectje modaal creëren en overal waar ik em nodig heb gebruik ik de modaal gecreëerde. Echter ben ik er om netheids-redenen niet helemaal happy mee. Of ben ik dan paranoïde? ;)

Misschien dat iemand nog een leuk idee voor mij hierover heeft? :)

Een experimentele community-site: https://technobabblenerdtalk.nl/. DM voor invite code.


  • Soultaker
  • Registratie: September 2000
  • Laatst online: 23:08
Als ik jou was zou ik gewoon de globale variabele handhaven; dat is eenvoudig, doeltreffend en efficient. Als je per se geen globale variabelen wilt gebruiken zou je een singleton klasse kunnen maken, die elke keer hetzelfde object teruggeeft. Echt veel win je daar niet mee, naar mijn idee.

Misschien heeft iemand anders nog betere ideeën, maar ik zou het persoonlijk hier dus bij laten. ;)

  • Woy
  • Registratie: April 2000
  • Niet online

Woy

Moderator Devschuur®
Dat je meerdere keren dezelfde waarde krijgt is omdat een Random functie altijd een seed heeft waaruit hij de random waardes berekend. Als je new Random() doet dan word er een nieuw random object aangemaakt met als seed de timestamp van dat moment. Omdat jij op dit moment heel snel achter elkaar Random objecten aanmaakt zullen een aantal precies dezelfde timestamp hebben en dus ook precies hetzelfde getal terug geven. Je zult dus inderdaad een variabele moeten maken die een Random object bevat en deze gebruiken. Je kan nu natuurlijk nog steeds een aparte functie ervan maken.

“Build a man a fire, and he'll be warm for a day. Set a man on fire, and he'll be warm for the rest of his life.”


  • mOrPhie
  • Registratie: September 2000
  • Laatst online: 20-08 15:04

mOrPhie

❤️❤️❤️❤️🤍

Topicstarter
Ik ben toch maar gegaan voor de Globale declaratie. Tnx voor de replies iig :)

Een experimentele community-site: https://technobabblenerdtalk.nl/. DM voor invite code.