Kom ihåg mig?
Home Menu

Menu


.NET C# generera rondom sifta med avstånd?

 
Ämnesverktyg Visningsalternativ
Oläst 2016-08-31, 09:30 #1
jayzee jayzee är inte uppkopplad
Har WN som tidsfördriv
 
Reg.datum: Aug 2008
Inlägg: 1 089
jayzee jayzee är inte uppkopplad
Har WN som tidsfördriv
 
Reg.datum: Aug 2008
Inlägg: 1 089
Alltid kul med starta dagen med en tankeställare

Kod:
    class Program
    {
        static void Main(string[] args)
        {
            Random randomGenerator = new Random();
            List<int> numbersList = new List<int>();
            int generatedValue = 0;
            int maxValue = 300;
            bool passed = false;

            // main loop
            while (numbersList.Count != 20)
            {
                while (!passed)
                {
                    generatedValue = randomGenerator.Next(0, maxValue);
                    passed = !numbersList.Any(x => (x > (generatedValue - 10)) && (x < (generatedValue + 10)));
                }

                passed = false; // reset passed flag
                numbersList.Add(generatedValue);
            }

            // sort list in ascending order
            numbersList.Sort();

            // print-out
            foreach (int value in numbersList)
            {
                Console.WriteLine(value.ToString());
            }

            Console.ReadKey();
        }
    }

Senast redigerad av jayzee den 2016-08-31 klockan 09:36
jayzee är inte uppkopplad   Svara med citatSvara med citat
Oläst 2016-08-31, 13:43 #2
Nerix Nerix är inte uppkopplad
Flitig postare
 
Reg.datum: Oct 2010
Inlägg: 398
Nerix Nerix är inte uppkopplad
Flitig postare
 
Reg.datum: Oct 2010
Inlägg: 398
Citat:
Ursprungligen postat av jayzee Visa inlägg
Alltid kul med starta dagen med en tankeställare

Kod:
    class Program
    {
        static void Main(string[] args)
        {
            Random randomGenerator = new Random();
            List<int> numbersList = new List<int>();
            int generatedValue = 0;
            int maxValue = 300;
            bool passed = false;

            // main loop
            while (numbersList.Count != 20)
            {
                while (!passed)
                {
                    generatedValue = randomGenerator.Next(0, maxValue);
                    passed = !numbersList.Any(x => (x > (generatedValue - 10)) && (x < (generatedValue + 10)));
                }

                passed = false; // reset passed flag
                numbersList.Add(generatedValue);
            }

            // sort list in ascending order
            numbersList.Sort();

            // print-out
            foreach (int value in numbersList)
            {
                Console.WriteLine(value.ToString());
            }

            Console.ReadKey();
        }
    }
Bra lösning! Tänkte något liknande själv först. Tror dock att den ändrar sannolikhetsfördelning en del.

- Givet
- Vi slumpar en siffra mellan 0 och 99 (vi kallar maxvärdet x)
- Distributionen är uniform, det är alltså lika stor chans att få 1 som 10 (givet att x >= 10).
- Ett 'försök' nedan är ett anrop till 'randomGenerator.Next'.
- Vi vill hitta y siffror, te.x 5 och 15.

- Exempel:
- Försök 1: 0 returnerades. Ok
- 1 till 10 är nu inte längre giltiga nummer.
- Försök 2 till 10: De ogiltiga siffrorna 2 till 10 returnerades.
- Försök 11: 11 returnerades. Ok.

- Alltså:
- Vid försök 1 är sannolikheten att få 0: 1/100 (100 siffror totalt mellan 0 och 99)
- Chansen att få 11 är nu (10 / 100 - 1), alltså 11% då siffrorna 2 till 10 betyder att vi måste välja på nytt.
- Tredje gången: (20 / 100 - 2).
- Sista gången: 10 * (y - 1) / (x - y - 1)

Det är alltså större chans att få en senare vald siffra än en tidigare. Generellt sett skulle ja inte rekommendera den här metoden.
Nerix är inte uppkopplad   Svara med citatSvara med citat
Svara


Aktiva användare som för närvarande tittar på det här ämnet: 1 (0 medlemmar och 1 gäster)
 

Regler för att posta
Du får inte posta nya ämnen
Du får inte posta svar
Du får inte posta bifogade filer
Du får inte redigera dina inlägg

BB-kod är
Smilies är
[IMG]-kod är
HTML-kod är av

Forumhopp


Alla tider är GMT +2. Klockan är nu 13:36.

Programvara från: vBulletin® Version 3.8.2
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
Svensk översättning av: Anders Pettersson
 
Copyright © 2017