Archief - [PROG]VB.Net vb.net random problem

Het archief is een bevroren moment uit een vorige versie van dit forum, met andere regels en andere bazen. Deze posts weerspiegelen op geen enkele manier onze huidige ideeën, waarden of wereldbeelden en zijn op sommige plaatsen gecensureerd wegens ontoelaatbaar. Veel zijn in een andere tijdsgeest gemaakt, al dan niet ironisch - zoals in het ironische subforum Off-Topic - en zouden op dit moment niet meer gepost (mogen) worden. Toch bieden we dit archief nog graag aan als informatiedatabank en naslagwerk. Lees er hier meer over of start een gesprek met anderen.

gemas

Legacy Member
Private Function random() As Integer
Dim nr As New Random
Dim terug As Integer = nr.Next(1, 100)
Return terug
End Function

iedere keer als ik deze functie aanroep krijg ik dezelfde waar terug.
weet iemand een oplossing voor dit?

tremor

Legacy Member
Een computer is technisch gezien nie in staat om "echte" random waardes te genereren, daarom maakt die gebruik van een algoritme om dit te doen

aangezien dit altijd hetzelfde algoritme is, gaat ge altijd dezelfde waardes terugkrijgen, de oplossing voor dit probleem is om een random seed mee te geven

Dim nr as New Random (DateTime.Now.MilliSecond)
--> op deze manier initialiseert ge uw random object met een random seed (namelijk de huidige milliseconden) en gaat ge dus betere random waardes krijgen

Messias.

Legacy Member
Maar normaalgezien gebruikt .NET, als je geen seed meegeeft, die timestamp als seed voor je pseudorandom.

Bij mij werkt gelijkaardige code dan bij de topicstarter wél. Zonder een seed op te geven.

Nuja, het houdt dus in dat je om één of andere reden altijd dezelfde seed meegeeft. Dat zorgt er dus voor dat je altijd hetzelfde nummer terugkrijgt. Tijd is een goeie seed voor praktische randoms. Heb je meer nodig, ga eens kijken bij System.Security.Cryptography.RandomNumberGenerator. Die kan gebruikt worden voor het opslaan van wachtwoorden enzo.

gemas

Legacy Member
ok nu werkt et wel, heb er wel ene sleep moeten tussen zetten van 10ms
omdat het systeem te vlug werkte, maakte nog meerdere randoms aan binne 1 milli seconde,

bedankt
als er iemand andere oplossingen heeft, ge zijt altijd welkom

gemas

Legacy Member
Dim nr As New Random
Private Function random() As Integer
Dim terug As Integer = nr.Next(1, 100)
Return terug
End Function

random erbuiten declareren en dan bolt et, zo simpel

Messias.

Legacy Member
Nee, dat is een goeie oplossing denk ik. Maar we hadden je beter kunnen helpen als je had gezegd in welke context je die random gebruikte. Blijkbaar gebruik je die in een iteratie (?), en daarmee dat je zodanig snel randoms genereerde dat de seed gans de tijd 't zelfde was.

gemas

Legacy Member
jeps het was in een for luske, dus hel snel veel getallen genereren

killgore

Legacy Member
Messias. zei:
Nee, dat is een goeie oplossing denk ik. Maar we hadden je beter kunnen helpen als je had gezegd in welke context je die random gebruikte. Blijkbaar gebruik je die in een iteratie (?), en daarmee dat je zodanig snel randoms genereerde dat de seed gans de tijd 't zelfde was.
in principe zou uw seed moeten veranderd worden terwijl ge uw next random opvraagt. Maak dat object nr static (dnno of da gaat en hoe ge het doet in vb :p) en voer bestaanscontrole uit en het zal ook werken :). . Of zoals hij hier deed, door je var als global te gebruiken (wat in veeeel talen als lelijk wordt beschouwd :p).

Het probleem is volgens mij liggen dat .net de "hardwareklok" (dnno hoe het juist noemt) gebruikt die idd maar tot op de zoveel ms update (ge kunt een analoog probleem hebben als ge een vrij exacte timer nodig hebt in de winapi in c). Of allessinds een analoge timer die niet zo extreem snel update.

Bij elke functie aanroep maakt hij dat Random object dus opnieuw aan en zal hij de standard seed van .net gebruiken. Als dit gebeurt binnen dat tijdsinterval is dat die klok niet is upgedate, dan zal dit inderdaad jouw seed en het gegenereerde randomgetal het zelfde zijn :).

Als je het dan static maakt en een check uitvoert, in c++ iets als dit:

Code:
static Random rnd = NULL;
if(rnd != NULL)
{
    rnd= new Random();
}

dan gaat hij niet telkens die standaard seed gebruiken maar als seed uw VORIGE gegenereerde random getal gebruiken en kom je dus gegarandeerd een ander getal uit.

Obliv`

Legacy Member
Als ge van die random ne private variabele maakt en hem vanboven in je module declareert, zou hij elke keer anders moeten zijn.
Het archief is een bevroren moment uit een vorige versie van dit forum, met andere regels en andere bazen. Deze posts weerspiegelen op geen enkele manier onze huidige ideeën, waarden of wereldbeelden en zijn op sommige plaatsen gecensureerd wegens ontoelaatbaar. Veel zijn in een andere tijdsgeest gemaakt, al dan niet ironisch - zoals in het ironische subforum Off-Topic - en zouden op dit moment niet meer gepost (mogen) worden. Toch bieden we dit archief nog graag aan als informatiedatabank en naslagwerk. Lees er hier meer over of start een gesprek met anderen.
Terug
Bovenaan