Kom ihåg mig?
Home Menu

Menu


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

Ämnesverktyg Visningsalternativ
Oläst 2016-08-30, 11:27 #1
naak2803 naak2803 är inte uppkopplad
Mycket flitig postare
 
Reg.datum: Jun 2011
Inlägg: 767
naak2803 naak2803 är inte uppkopplad
Mycket flitig postare
 
Reg.datum: Jun 2011
Inlägg: 767
Standard .NET C# generera rondom sifta med avstånd?

Hej,
behöver lite hjälp med att skapa ett litet script i C# där man ska kunna generera en lista på 20 random siffor med minst 10 tal emallan.

ex.

randomsiffran blir 55
lägg den i listan

nästa randomsiffra blir 50
slumpa om så det minst skiljer sig +- 10 från nån annan siffra i listan
nya randomsiffra blir 84
lägg den i listan

gör om 20 gånger...

efter 20 gånger ska det finns 20 random siffror i listan där alla siffror har ett avstånd på minst +-10 tal emallan sig.
naak2803 är inte uppkopplad   Svara med citatSvara med citat
Oläst 2016-08-30, 15:52 #2
Knockout Knockout är inte uppkopplad
Nykomling
 
Reg.datum: Aug 2014
Inlägg: 12
Knockout Knockout är inte uppkopplad
Nykomling
 
Reg.datum: Aug 2014
Inlägg: 12
Kod:
int startnumber = 55;
Random rand = new Random((int)DateTime.Now.Ticks);
int RandomNumber = rand.Next(startnumber + 20, startnumber + 1000);
Nåt sånt borde väl funka.
Bara lägga det i någon loop för att få ut flera värden.
Knockout är inte uppkopplad   Svara med citatSvara med citat
Oläst 2016-08-30, 17:05 #3
naak2803 naak2803 är inte uppkopplad
Mycket flitig postare
 
Reg.datum: Jun 2011
Inlägg: 767
naak2803 naak2803 är inte uppkopplad
Mycket flitig postare
 
Reg.datum: Jun 2011
Inlägg: 767
Citat:
Ursprungligen postat av Knockout Visa inlägg
Kod:
int startnumber = 55;
Random rand = new Random((int)DateTime.Now.Ticks);
int RandomNumber = rand.Next(startnumber + 20, startnumber + 1000);
Nåt sånt borde väl funka.
Bara lägga det i någon loop för att få ut flera värden.
hur menar du att den där skulle fungera? det finns inget som säger att två siffror inte får vara närmare än 10
naak2803 är inte uppkopplad   Svara med citatSvara med citat
Oläst 2016-08-31, 09:30 #4
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, 11:34 #5
naak2803 naak2803 är inte uppkopplad
Mycket flitig postare
 
Reg.datum: Jun 2011
Inlägg: 767
naak2803 naak2803 är inte uppkopplad
Mycket flitig postare
 
Reg.datum: Jun 2011
Inlägg: 767
tackar! var exakt det jag leta efter!
naak2803 är inte uppkopplad   Svara med citatSvara med citat
Oläst 2016-08-31, 13:43 #6
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 09:50.

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