Avatar billede csharped Nybegynder
11. november 2002 - 17:11 Der 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 :)
Avatar billede arne_v Ekspert
11. november 2002 - 17:24 #1
Altså nu kender jeg ikke meget til C#.

Men pseudo-random-number-generators generelt fungerer
efter princippet, at du sætter en start seed 1 gang
og diverefter genererer N tilfældige tal.

Samme seed => samme tilfældige tal.

Forskellig seed => forskellige tilfældige tal.

Og det betyder da intet, hvor hurtig din maskine er.

Du må ikke sætte seed hver gang du skal brug et
tilfældigt tal.

Heller ikke på en langsom maskine.
Avatar billede kichian Nybegynder
11. november 2002 - 22:57 #2
int const MAX_ELEMENTER = 1000;
Random rndTal = new Random();
ArrayList talListe = new ArrayList(MAX_ELEMENTER);

for (int i = 0;i < MAX_ELEMENTER; i++)
{
  talListe[i] = rndTal.Next();
}

Derudover er arne_v's betragtninger korrekte :-)

At du ikke selv kan initialisere Random med tid (DataTime.ToDay.Tics) skyldes at Tics er en long.
Avatar billede kichian Nybegynder
11. november 2002 - 22:59 #3
Og talListe[i] = rndTal.Next(); er selvfølgelig talListe.Add(rndTal.Next());
Avatar billede jper Nybegynder
15. november 2002 - 14:59 #4
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);
            }
Avatar billede arne_v Ekspert
15. november 2002 - 15:12 #5
Det er ikke den rigtigt måde at bruge en random
generator på.
Avatar billede jper Nybegynder
15. november 2002 - 22:51 #6
Det virker, så det er netop den rigtige måde.

Hvad med at underbygge din påstand?
Avatar billede arne_v Ekspert
15. november 2002 - 23:03 #7
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å.
Avatar billede kichian Nybegynder
17. november 2002 - 12:29 #8
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.
Avatar billede kichian Nybegynder
18. november 2002 - 15:53 #9
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();
}
Avatar billede csharped Nybegynder
18. november 2002 - 22:37 #10
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.
Avatar billede csharped Nybegynder
18. november 2002 - 22:38 #11
using System;
using System.Collections;

public class UniqueID
{
    private string text;
   
    public UniqueID()
    {
        Random random = new Random( unchecked( (int)DateTime.Now.Ticks ) );
       
        for ( int i=0; i < 32; i++ )
        {
            this.text += (char) random.Next( 97, 123 );
        }
    }
   
    public string Text
    {
        get
        {
            return text;
        }
    }
}

public class MainClass
{
    public static void Main(string[] args)
    {
        string[] strArr = new string[1000];
       
        for( int i=0; i<1000; i++ )
        {
            UniqueID uID = new UniqueID();
            strArr[i] = uID.Text;
        }
       
        foreach( string id in strArr )
            Console.WriteLine( id );
    }
}
Avatar billede kichian Nybegynder
19. november 2002 - 10:30 #12
Du ændrer din klasse UniqueID til:

public class UniqueID
{
    private string text;
    private static Random random = new Random( unchecked( (int)DateTime.Now.Ticks ) );

    public UniqueID()
    {       
        for ( int i=0; i < 32; i++ )
        {
            this.text += (char) random.Next( 97, 123 );
        }
    }
   
    public string Text
    {
        get
        {
            return text;
        }
    }
}
Avatar billede csharped Nybegynder
19. november 2002 - 14:31 #13
Selvfølgelig, selvfølgelig, selvfølgelig... du er genial... thanks... det liger jo lige for, nu du skriver det...
Avatar billede Ny bruger Nybegynder

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.

Loading billede Opret Preview
Kategori
IT-kurser om Microsoft 365, sikkerhed, personlig vækst, udvikling, digital markedsføring, grafisk design, SAP og forretningsanalyse.

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester