Toon posts:

[C#] random int's in klasse genereren

Pagina: 1
Acties:
  • 113 views sinds 30-01-2008
  • Reageer

Verwijderd

Topicstarter
Hoi,

Ik heb dus een klasse gemaakt waarbij ik in de constructor een maximum waarde meegeef.
Dan moet ik 2 waarden genereren die volledig random zijn tussen 0 en die max waarde.

Nu ik maar dus een array met die objecten.
Het probleem is dat de waarden telkens hetzelfde zijn, dus bijvoorbeeld:
array[1].getal1 = 5
array[1].getal2 = 8

array[2].getal1 = 5
array[2].getal2 = 8

array[3].getal1 = 5
array[3].getal2 = 8

Ik weet niet hoe zo iets mogelijk is, maar ik denk dat er dus wel een verklaring moet voor zijn.

De code van het creeren van de tabel:

PHP:
1
2
3
4
5
alOefeningen = new Oefening[aantal];
                    for (int i = 0; i < aantal; i++) {
                        Oefening o = new Oefening(max);
                        alOefeningen[i] = o;
                    }


De constructor van de klasse:

PHP:
1
2
3
4
5
6
public Oefening(int max){
            Random g = new Random();

            this.Getal1 = g.Next(0, max+1);
            this.Getal2 = g.Next(0, max+1);
}


Iemand die raad weet?

dank bij voorbaat,
eugene

  • r5d
  • Registratie: Februari 2002
  • Niet online

r5d

Read more, write less...

Lijkt heel erg op een huiswerk opgave ;) Dus ik ga je niet alles vertellen. Tip: kijk eens naar je random klasse, wordt daar niet elke keer als je een getal wilt produceren een nieuwe instantie van gemaakt? Hoe random kan hij dan nog zijn :9

spoiler:
Pimp Daddy roept iets met 'static' ofzo

Later betaal je meer, maar dan heb je wel een gratis datalimiet....


Verwijderd

Topicstarter
Nee hoor geen huiswerk, dit is voor een programmatje die ik voor mezelf maak :)

Hoe bedoel je juist?
Ik roep toch telkens in die lus "Oefening o = new Oefening(max);" op, dus creert hij een nieuwe instantie.

  • gorgi_19
  • Registratie: Mei 2002
  • Laatst online: 16:49

gorgi_19

Kruimeltjes zijn weer op :9

PimpDiddy schreef op zondag 02 juli 2006 @ 10:38:
Lijkt heel erg op een huiswerk opgave ;) Dus ik ga je niet alles vertellen. Tip: kijk eens naar je random klasse, wordt daar niet elke keer als je een getal wilt produceren een nieuwe instantie van gemaakt? Hoe random kan hij dan nog zijn :9

spoiler:
Pimp Daddy roept iets met 'static' ofzo
Kijk eens met reflector naar de Random class, na verloop van tijd begint hij weer opnieuw :P
Verwijderd schreef op zondag 02 juli 2006 @ 10:41:
Nee hoor geen huiswerk, dit is voor een programmatje die ik voor mezelf maak :)

Hoe bedoel je juist?
Ik roep toch telkens in die lus "Oefening o = new Oefening(max);" op, dus creert hij een nieuwe instantie.
Visual Basic .NET:
1
2
3
Public Sub New()
      Me.New(Environment.TickCount)
End Sub

De constructor van System.Random :) Oftewel: Als je heel snel achter elkaar het object aanmaakt, zal Environment.TickCount steeds dezelfde waarde hebben; Random dus dezelfde seed hebben en dus dezelfde waarden er uit gooien :)

[ Voor 43% gewijzigd door gorgi_19 op 02-07-2006 10:46 ]

Digitaal onderwijsmateriaal, leermateriaal voor hbo


Verwijderd

In de documentatie van de random class staat:
Represents a pseudo-random number generator, a device that produces a sequence of numbers that meet certain statistical requirements for randomness.
Dat betekent dat de waarden die er uit komen niet echt random zijn maar worden berekend met een bepaalde formule. Telkens wanneer je een nieuw Random object aanmaakt wordt die formule weer op zijn startwaarde gezet, en zal er dus dezelfde uitkomst uitkomen. Dit kan je op 2 manieren oplossen. 1: Geef de constructor van Random een seed mee (zie docs) of 2: bewaar je random object tussen aanroepen van je method (bijvoorbeeld door hem een member te maken van je class).

  • moto-moi
  • Registratie: Juli 2001
  • Laatst online: 09-06-2011

moto-moi

Ja, ik haat jou ook :w

PimpDiddy schreef op zondag 02 juli 2006 @ 10:38:
Tip: kijk eens naar je random klasse, wordt daar niet elke keer als je een getal wilt produceren een nieuwe instantie van gemaakt? Hoe random kan hij dan nog zijn :9
Wat heeft in dit geval het aanmaken van een klasse ermee te maken wat voor uitvoer hij geeft?
Wat er 'fout' is dat er geen random seed wordt gebruikt imo.

God, root, what is difference? | Talga Vassternich | IBM zuigt


  • EfBe
  • Registratie: Januari 2000
  • Niet online
De Random class gebruikt ook de time als initial seed, en tuurlijk als je de constructor 2 keer heel snel achter elkaar aanroept heb je dezelfde seed. Tja, zonder professionele randomizer is het genereren van echte random getallen toch sowieso uitgesloten.

Creator of: LLBLGen Pro | Camera mods for games
Photography portfolio: https://fransbouma.com


Verwijderd

Verwijderd schreef op zondag 02 juli 2006 @ 10:44:
In de documentatie van de random class staat:

[...]


Dat betekent dat de waarden die er uit komen niet echt random zijn maar worden berekend met een bepaalde formule. Telkens wanneer je een nieuw Random object aanmaakt wordt die formule weer op zijn startwaarde gezet, en zal er dus dezelfde uitkomst uitkomen. Dit kan je op 2 manieren oplossen. 1: Geef de constructor van Random een seed mee (zie docs) of 2: bewaar je random object tussen aanroepen van je method (bijvoorbeeld door hem een member te maken van je class).
pseudo random is random genoeg, alle encryptie algoritmen genereren ook pseudo random getallen. (echt random kun je alleen krijgen door dingen als radioactief verval te meten en daar dan iets mee te doen, tegenwoordig worden vooral dingen zoals netwerkbelasting,cpu belasting, geheugengebruik e.d. gebruikt om iets random te genereren). Tenminste volgens m'n computer security en cryptografie boek van de ut :)

Verwijderd

Verwijderd schreef op zondag 02 juli 2006 @ 13:47:
[...]
netwerkbelasting,cpu belasting, geheugengebruik e.d.
En ook de ruis van de geluidskaart is een eindeloze bron van pseudo-random getallen. ;)

  • .oisyn
  • Registratie: September 2000
  • Laatst online: 15:01

.oisyn

Moderator Devschuur®

Demotivational Speaker

moto-moi schreef op zondag 02 juli 2006 @ 10:50:

Wat heeft in dit geval het aanmaken van een klasse ermee te maken wat voor uitvoer hij geeft?
Wat er 'fout' is dat er geen random seed wordt gebruikt imo.
Toch niet, hoewel een random sequence een min of meer uniforme distributie heeft, is het niet gegarandeerd dat dat ook geldt voor de verzameling van het eerste resultaat van elke seed. Daarnaast zul je voor random seeds ook weer een random number generator moeten gebruiken, dus je bent dan geen steek verder. Dezelfde Random instance gebruiken is dus wél de enige juiste oplossing.

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.


Verwijderd

Topicstarter
Ok, bedankt. Het probleem lag hem inderdaad bij de seed.

Nu ik heb geprobeerd om de milliseconden van de systeemklok mee te geven, maar dit was echter nog te traag.

Ik heb het simpel opgelost door mijn Random te declareren in de methode waarin ik dan die loop zet om de tabel te vullen, en die dan mee te geven met een extra parameter aan de constructor

tyvm,
Sk4nd0n

  • r5d
  • Registratie: Februari 2002
  • Niet online

r5d

Read more, write less...

.oisyn schreef op zondag 02 juli 2006 @ 17:54:
[...]
Toch niet, hoewel een random sequence een min of meer uniforme distributie heeft, is het niet gegarandeerd dat dat ook geldt voor de verzameling van het eerste resultaat van elke seed. Daarnaast zul je voor random seeds ook weer een random number generator moeten gebruiken, dus je bent dan geen steek verder. Dezelfde Random instance gebruiken is dus wél de enige juiste oplossing.
:) Juist.

@Moi-moi Ik zeg niet dat er geen andere oplossingen bestaan voor dit "probleem". Maar in dit geval is het gewoon makkelijker, sneller en netter om maar één instantie van de Random klasse aan te maken.

Later betaal je meer, maar dan heb je wel een gratis datalimiet....


  • .oisyn
  • Registratie: September 2000
  • Laatst online: 15:01

.oisyn

Moderator Devschuur®

Demotivational Speaker

Verwijderd schreef op zondag 02 juli 2006 @ 20:16:
Nu ik heb geprobeerd om de milliseconden van de systeemklok mee te geven, maar dit was echter nog te traag.

Ik heb het simpel opgelost door mijn Random te declareren in de methode waarin ik dan die loop zet om de tabel te vullen, en die dan mee te geven met een extra parameter aan de constructor
Mja, zo kan het ook, maar waarom moet degene die verantwoordelijk is voor het maken van een oefening verantwoordelijk zijn voor het aanmaken en meegeven van de Random instance? Het lijkt me typisch iets dat alleen voor Oefening zelf boeiend is en niet voor de buitenwereld. Ik zou dus gewoon een static Random instance in Oefening definieren die je voor dat soort doeleinden gebruikt

Waarom zet je C# code trouwens binnen php tags? We hebben ook gewoon code tags, en met [code=C#] kun je zelfs syntax highlighting voor C# gebruiken :)

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.


  • gorgi_19
  • Registratie: Mei 2002
  • Laatst online: 16:49

gorgi_19

Kruimeltjes zijn weer op :9

PimpDiddy schreef op zondag 02 juli 2006 @ 20:28:
@Moi-moi Ik zeg niet dat er geen andere oplossingen bestaan voor dit "probleem". Maar in dit geval is het gewoon makkelijker, sneller en netter om maar één instantie van de Random klasse aan te maken.
Nee, want je krijgt na een x-aantal elementen alsnog weer dezelfde

[ Voor 4% gewijzigd door gorgi_19 op 02-07-2006 20:36 ]

Digitaal onderwijsmateriaal, leermateriaal voor hbo


  • .oisyn
  • Registratie: September 2000
  • Laatst online: 15:01

.oisyn

Moderator Devschuur®

Demotivational Speaker

Dan reset je de seet na een x aantal keer. Elke keer een andere Random aanmaken is simpelweg nog veel minder random en dus niet aan te raden. Daarnaast is het nog maar de vraag of die herhaling binnen een afzienbare tijd optreedt.

[ Voor 24% gewijzigd door .oisyn op 03-07-2006 02:22 ]

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.


Verwijderd

Topicstarter
.oisyn schreef op zondag 02 juli 2006 @ 20:33:
[...]

Waarom zet je C# code trouwens binnen php tags? We hebben ook gewoon code tags, en met [code=C#] kun je zelfs syntax highlighting voor C# gebruiken :)
Ik wist niet van het bestaan af en ik vond ook niet direct een lijst me die tags terug :(

  • .oisyn
  • Registratie: September 2000
  • Laatst online: 15:01

.oisyn

Moderator Devschuur®

Demotivational Speaker

Onder het menu FAQ, kies "UBB codes". Staat vrij onderaan die pagina ;)

[ Voor 10% gewijzigd door .oisyn op 03-07-2006 15:21 ]

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.

Pagina: 1