[C#] Waarom hebben de objecten dezelfde waarde?

Pagina: 1
Acties:

  • Mastermind
  • Registratie: Februari 2000
  • Laatst online: 29-11 15:35
Ik ben tegen iets vreemds aangelopen toen ik random kleuren voor de tijdsbalken in de scheduler waar ik mee bezig ben wilde maken.

C#:
1
2
3
4
5
6
7
8
9
private void dbiSchedule1_BeforeTimeBarInsert(object sender, BeforeTimeBarInsertEventArgs e)
{
e.TimeBarItem.BackColor = 
      Color.FromArgb(
      new Random().Next(255), 
      new Random().Next(255), 
      new Random().Next(255)
      );
}


Je zou toch verwachten dat hij random kleuren genereert? Maar wat hij doet is random grijswaarden genereren. Dit komt, heb ik ontdekt, dat alle 3 de random int-objecten op een of andere manier dezelfde waarde krijgen. 8)7


Op deze manier werkt het wel:
C#:
1
2
3
4
5
6
7
8
private void dbiSchedule1_BeforeTimeBarInsert(object sender, BeforeTimeBarInsertEventArgs e)
{
Random rd = new Random();
int r= rd.Next(255);
int g = rd.Next(255);
int b = rd.Next(255);
e.TimeBarItem.BackColor = Color.FromArgb(r, g, b);
}


Maar waarom werkte de eerste methode niet?

  • Nvidiot
  • Registratie: Mei 2003
  • Laatst online: 03-06 16:38

Nvidiot

notepad!

Omdat je de Random() niet initialiseert met een "random" waarde zoals bevoorbeeld de huidige tijd :)

What a caterpillar calls the end, the rest of the world calls a butterfly. (Lao-Tze)


  • .oisyn
  • Registratie: September 2000
  • Laatst online: 14:52

.oisyn

Moderator Devschuur®

Demotivational Speaker

Ze krijgen allemaal dezelfde seed, zoals je waarschijnlijk wel gewoon in de docs kunt lezen. En al zou de seed wel random zijn, dan nog is de tweede manier beter omdat de distributieregels die voor een random sequence gelden niet per se hoeven te gelden voor de sequence van het eerste getal van elke seed.

Nog beter is gewoon een enkele Random aan te maken en daar gebruik van maken, ipv voor elke kleur een ander Random object

[ Voor 71% gewijzigd door .oisyn op 20-12-2006 14:14 ]

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


  • XIU
  • Registratie: Augustus 2005
  • Laatst online: 30-10-2023

XIU

De default constructor van Random gebruikt het huidig aantal ticks als seed, omdat de 3 calls op hetzelfde moment gebruikt worden hebben alle 3 dus dezelfde start seed met gevolg dat ze alle 3 dezelfde waarden teruggeven :)

Zoals gezegd moet je de Random instantie dus bijhouden en deze verder gebruiken

  • Mastermind
  • Registratie: Februari 2000
  • Laatst online: 29-11 15:35
De docs zeggen juist dat bij een new Random() er een random seed op basis van de tijd gemaakt wordt. Aangezien ik 3x new Random() gemaakt heb, moet hij dus 3x een andere seed gebruiken.
Maak ook al zou hij dezelfde seed gebruiken, dan nog moet hij 3 verschillende getallen produceren.

  • whoami
  • Registratie: December 2000
  • Laatst online: 18:04
Je moet je Randommer wel seeden;
The random number generation starts from a seed value. If the same seed is used repeatedly, the same series of numbers is generated. One way to produce different sequences is to make the seed value time-dependent, thereby producing a different series with each new instance of Random.

To improve performance, create one Random to generate many random numbers over time, instead of repeatedly creating a new Random to generate one random number.
code:
1
2
3
4
5
6
Random rd = new Random(); // Hier wordt er een autogenerated seed gebruikt, afh. van de tijd.
                                          // Aangezien jij direct 3x na elkaar een Random class maakt, is de 
                                         // kans dus groot dat ze allen dezelfde seed krijgen
int r = rd.Next (255);
int g = rd.Next (255);
int b = rd.Next (255);
Maak ook al zou hij dezelfde seed gebruiken, dan nog moet hij 3 verschillende getallen produceren.
Waarom ? Als ze dezelfde seed krijgen, dan genereren ze dezelfde random nummers.
Test het maar uit:
code:
1
2
3
4
Random r1 = new Random(5);
Random r2 = new Random(5);
Console.WriteLine (r1.Next().ToString());
Console.WriteLine (r2.Next().ToString());

[ Voor 17% gewijzigd door whoami op 20-12-2006 14:19 ]

https://fgheysels.github.io/


  • Mastermind
  • Registratie: Februari 2000
  • Laatst online: 29-11 15:35
Ok, duidelijk :)
Pagina: 1