Avatar billede postbil Nybegynder
29. september 2012 - 15:27 Der er 4 kommentarer

Random verdier

Hejsa.

Jeg sidder og prøver på at få lavet en kodestump der generer to random integer verdier. men når jeg køre programmet får jeg heletiden to ens verdier. Hvad gør jeg forkert? (Det er en del af en skole opgave)
Her er den kode jeg har skrevet.

class Program
    {
        static void Main(string[] args)
        {
            Random r1 = new Random();
            Random r2 = new Random();
                int i1 = r1.Next(1,7);
                int i2 = r2.Next(1,7);   
            Console.WriteLine(i1);
            Console.WriteLine(i2);   
           
            Console.ReadKey();
        }
    }

I1 og i2 vil hele tiden udskrive det samme tal. Hvorfor det?

Hilsen Mik Christensen
Avatar billede Syska Mester
29. september 2012 - 15:58 #1
Da Random er lavet ud fra et tids stempel, vil 2 random instancer lavet på samme tid give de samme værdier.

Løsning ... brug den samme Random instance så vil det give 2 forskellige værdier.

Dvs ... brug r1 begge steder.

mvh
Avatar billede Syska Mester
29. september 2012 - 16:01 #2
Hvis du decompiler Random kan du se følgende:
public Random()
      : this(Environment.TickCount)
    {
    }

    [__DynamicallyInvokable]
    public Random(int Seed)
    {
      int num1 = 161803398 - (Seed == int.MinValue ? int.MaxValue : Math.Abs(Seed));
      this.SeedArray[55] = num1;
      int num2 = 1;
      for (int index1 = 1; index1 < 55; ++index1)
      {
        int index2 = 21 * index1 % 55;
        this.SeedArray[index2] = num2;
        num2 = num1 - num2;
        if (num2 < 0)
          num2 += int.MaxValue;
        num1 = this.SeedArray[index2];
      }
      for (int index1 = 1; index1 < 5; ++index1)
      {
        for (int index2 = 1; index2 < 56; ++index2)
        {
          this.SeedArray[index2] -= this.SeedArray[1 + (index2 + 30) % 55];
          if (this.SeedArray[index2] < 0)
            this.SeedArray[index2] += int.MaxValue;
        }
      }
      this.inext = 0;
      this.inextp = 21;
      Seed = 1;
    }

Dvs du kan vælge at give din egen seed værdi med, hvilket så vil give en Random værdi ved begge. Men så vil det nok alligevel blive ens for hver kørsel af programmet.

Default ctor bruger "Environment.TickCount" som giver antal ms siden systemet blev startet ... og det er grunden til at du ser de samme Random værdier.

Håber det er forklaring nok.

mvh
Avatar billede janus_007 Nybegynder
29. september 2012 - 19:24 #3
Lavede en lille sjov en... inspireret af MSSQL, newid() og order by :)


Herunder er en anden måde at lave et random nummer uden at bruge den indbyggede random:


static void Main(string[] args)
        {
            var numbers = new List<int>();

            var sw = new System.Diagnostics.Stopwatch();
            sw.Start();
            for (int i = 0; i < 1000000; i++)
            {
                numbers.Add(Enumerable.Range(1, 6).Select(x => new { Number = x, guid = Guid.NewGuid() }).OrderBy(x => x.guid).First().Number);

               
               
            }
            Console.WriteLine(sw.Elapsed);

            numbers.Distinct().OrderBy(x => x).ToList().ForEach(number =>
            {
                Console.WriteLine(number + ": " + numbers.Where(x => x == number).Count());
            });

            numbers.Clear();
            sw.Restart();
            var random = new Random();
            for (int i = 0; i < 1000000; i++)
            {
                numbers.Add(random.Next(1, 7));

            }
            Console.WriteLine(sw.Elapsed);

            numbers.Distinct().OrderBy(x => x).ToList().ForEach(number =>
            {
                Console.WriteLine(number + ": " + numbers.Where(x => x == number).Count());
            });



        }
Avatar billede arne_v Ekspert
29. september 2012 - 20:29 #4
http://www.eksperten.dk/guide/680
http://www.eksperten.dk/guide/686
http://www.eksperten.dk/guide/951

den foerste beskriver problemet her i sektionen "Uheldig brug af tilfældige tal generatorer".
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

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