Gå til innhold

C#: Random.Next(); i for loop oppfører seg "rart"


Anbefalte innlegg

Koden under viser en enkel sak som lager en kort tilfelding string som skal være unik i forhold til de andre som er lagd før.

Problemet er at den ikke lager tilfeldige strenger, men gir følgende output:

 

yextue
yextue
yextue
yextue
yextue
yextue
yextue
yextue
yextue
yextue
yextue
yextue
yextue
yextue
yextue
yextue
yextue
yextue
yextue
yextue
yextue
yextue
yextue
yextue
yextue
uolyog
egpjug
egpjug
egpjug
egpjug
egpjug
egpjug
egpjug
egpjug
egpjug
egpjug
egpjug
egpjug
egpjug
egpjug
egpjug
egpjug
egpjug
egpjug
jjhyui
jjhyui
jjhyui
jjhyui
jjhyui
jjhyui
jjhyui
jjhyui
jjhyui
jjhyui
jjhyui
jjhyui
jjhyui
jjhyui
jjhyui
jjhyui
jjhyui
jjhyui
sblkai
sblkai
sblkai
sblkai
sblkai
sblkai
sblkai
sblkai
sblkai
sblkai
sblkai
sblkai
sblkai
sblkai
sblkai
sblkai
sblkai
sblkai
sblkai
sblkai
sblkai
sblkai
sblkai
sblkai
sblkai
sblkai
olypul
olypul
olypul
olypul
olypul
olypul
olypul
olypul
olypul
olypul
olypul
olypul

Altså, en del helt klart ikke unike strenger. Hvis jeg debugger programmet, blir det riktig, men ikke hvis det kjøres utenfor.

 

 

private static string[] bokstaver = { "a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l", "m", "n", "o", "p", "q", "r", "s", "t", "u", "v", "w", "x", "y", "z" };
       private static StringBuilder sb;
       private static Dictionary<string, string> dict = new Dictionary<string, string>();

       public static void Main(string[] args)
       {
           for (int i = 0; i < 100; i++)
           {
               string s = Neste(6);
               Console.WriteLine(s);
           }
           Console.ReadLine();
       }

       private static string Neste(int lengde)
       {
           sb = new StringBuilder();
           Random r = new Random();

               do
               {
                   for (int i = 0; i < lengde; i++)
                   {
                       sb.Append(bokstaver[r.Next(0, 25)]);
                   }

               } while (dict.ContainsValue(sb.ToString()));

           return sb.ToString();
       }

       }

Endret av Techster
Lenke til kommentar
Videoannonse
Annonse

Jeg vet dette ikke er den fineste løsninga, men da jeg hadde tilsvarende prblemstilling i vbs så løste jeg dette ved å legge inn en random tidsforsinkelse melom hver iterasjon.

Men hvis det er snakk om et meget stort antall iterasjoner, så må nok andre metoder tas i bruk.

 

Yes, det er forsøkt og det virker. Men det er jo akkurat samme koden som kjører i samme rekkefølge som gjør at det er så veldig merkelig!

Lenke til kommentar

Jeg vet dette ikke er den fineste løsninga, men da jeg hadde tilsvarende prblemstilling i vbs så løste jeg dette ved å legge inn en random tidsforsinkelse melom hver iterasjon.

Men hvis det er snakk om et meget stort antall iterasjoner, så må nok andre metoder tas i bruk.

 

Yes, det er forsøkt og det virker. Men det er jo akkurat samme koden som kjører i samme rekkefølge som gjør at det er så veldig merkelig!

 

Hehe, ser jeg hadde glemte en ting;

dict.add(i.tostring(), s);

Lenke til kommentar

problemet ditt er at random ikke er tilfeldig, den er psaudo-tilfeldig basert på variabler. Gitt 1 og samme seed vil random gjøre det samme hver gang; om du ikke manuelt setter inn en seed så vil seeden ble laget ut i fra ulike variabler som f.eks. system-tiden.

 

Kort fortelt er problemet at du i hver iterasjon av løkken lager en ny instans av "Random"-klassen og bruker denne. Dette gjør at du seeder den hver gang, og siden ting skjer så fort etter hverandre bruker den samme seed mange ganger.

 

En mulig løsning ville f.eks. vært slik:

private static string[] bokstaver = { "a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l", "m", "n", "o", "p", "q", "r", "s", "t", "u", "v", "w", "x", "y", "z" };
       private static StringBuilder sb;
       private static Dictionary<string, string> dict = new Dictionary<string, string>();
       private static Random r = new Random();

       public static void Main(string[] args)
       {
           for (int i = 0; i < 100; i++)
           {
               string s = Neste(6);
               Console.WriteLine(s);
           }
           Console.ReadLine();
       }

       private static string Neste(int lengde, Random r)
       {
           sb = new StringBuilder();

               do
               {
                   for (int i = 0; i < lengde; i++)
                   {
                       sb.Append(bokstaver[r.Next(0, 25)]);
                   }

               } while (dict.ContainsValue(sb.ToString()));

           return sb.ToString();
       }

       }

  • Liker 1
Lenke til kommentar

Opprett en konto eller logg inn for å kommentere

Du må være et medlem for å kunne skrive en kommentar

Opprett konto

Det er enkelt å melde seg inn for å starte en ny konto!

Start en konto

Logg inn

Har du allerede en konto? Logg inn her.

Logg inn nå
×
×
  • Opprett ny...