Visa ett inlägg
Oläst 2016-08-31, 13:43 #5
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