11. november 2002 - 17:11Der er
12 kommentarer og 1 løsning
Tilfældige til med C#
Hejsa
Er der nogle der ved hvordan jeg fylder en ArrayList[1000] med tilfældige tal... jeg kan ikke bare initialisere Random() med tid, da min maskine meget hurtigere end det... please skriv et stum kode, hvis der er en flink sjæl som ved det... på forhånd mange tak :)
En måde at løse problemet på er at sætte farten lidt ned i genereringen: int[] intArray = new int[1000]; for(int i=0;i<=intArray.GetUpperBound(0);i++) { Random rand = new Random(); intArray[i] = rand.Next(); Console.WriteLine("Nummeret i indeks " + i + " er " + intArray[i]); System.Threading.Thread.Sleep(20); }
Hvorfor konkluderer du at fordi koden kompiler og kører, at det er den rigtige måde ?
Har du lavet en statistisk analyse af de genererede tal og påvist, at de er ligeså tilfældige som ved ved en initialisering ?
Ja - jeg ved det er et retorisk spørgsmål.
Jeg er godt klar over at koden virker. Men det er ikke en optimal anvendelse af en random generator.
Der er dygtige matematikere som har arbejdet på at udvikle avancerede algoritmer til at generere en serie af pseudo-random udfra en start seed. Og som har dokumenteret deres statistiske egenskaber.
Men det foregår altså efter princippet: - en initialisering - mange kald
Ved at initialisere hyppigt med noget der formentligt ikke er tilfældigt (det originale spørgsmål antyder at de bruger tiden - og T T+20 T+40 ... er absolut ikke tilfældigt), så ødelægger man hele analysen bag algoritmen. Der er ikke længere nogen garanti for at de virker tilfældige. Derfor er det en forkert måde at gøre det på.
jper -> Hvilket problem er det du forsøger at løse? For udgangspunktet om at "maskine meget hurtigere end det", er ikke reelt. Dvs. at hastigheden på maskinen INTET har med genereringen af pseudo-tilfældige tal. punktum.
Og så vil jeg atter bekræfte at arne_v's betragtninger er korrekte.
Summa sumarum : Brugen af Random, selv på meget hurtige maskiner. Hvis man er i tvivl så RTFM.
int const MAX_ELEMENTER = 1000; int[] intArray = new int[MAX_ELEMENTER]; Random rand = new Random(unchecked((int)DateTime.Now.Ticks)); // Den eneste generator der er behov for!!!!
for(int i = 0; i < MAX_ELEMENTER; i++) { intArray[i] = rand.Next(); }
Jeg har nok fået forklaret mig lidt dårligt, så her er den kode som ikke giver det resultat som jeg gerne skal bruge... idéen er at jeg skal have 1000 tilfældig generede strings og hvis du køre nedenstående, vil du kunne se at mange af dem er ens, da random bliver initialiseret inden for sammen sekund.
Selvfølgelig, selvfølgelig, selvfølgelig... du er genial... thanks... det liger jo lige for, nu du skriver det...
Synes godt om
Ny brugerNybegynder
Din løsning...
Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.