![]() |
5 siffror i slumpmässig ordning? asp.net c#
Hej,
Nu kanske jag är trött en fredagsnatt... men hur kan jag i c# få 5 siffror i slumpmässig ordning? siffror ska vara 1-5 och samma siffra ska inte upprepas. ex 1 5 4 2 3 3 5 4 2 1 1 5 2 1 3 |
lyckades komma på lösningen själv...
Kod:
Random random = new Random(); |
Jag skulle rekommendera att du alltid tar för vana att lägga ut programkod i egna klasser så det ligger så lite kod i ASP/Webbsidorna som möjligt, nu se jag inte exakt hur du gjort men jag bidrar här även med en förbättring av din slumpfunktion, för den behöver initieras med ett slumpmässigt värde annars kommer den att upprepa samma sekvens av tal om du startar programmet i morgon.
För att testa att slumpmässigheten är effektiv så måste man anropa samma funktion många gånger i rad och se att man inte kan uppfatta en regelbundenhetr i slumtalen. Först lite testkod.... Kod:
// Class: Program Kod:
// Class: RandomNumber Kod:
// Class: Slump Namespace kan ju ändras till valfritt, eftersom det inte är något som krävs i övrigt av klasserna. |
Kod:
class MittProgram |
Ska vi tjafsa om kortaste koden så vill jag ha sista ordet:
Den här koden är allt som behövs för att sortera en lista i slumpmässig ordning om man kör C#: Kod:
static int seed = Environment.TickCount; |
Å här är samma lösning i Ruby
Kod:
(1..5).to_a.shuffle |
Citat:
|
Citat:
Det är ju inte så att implementeringen ser ut så här. http://imgs.xkcd.com/comics/random_number.png Så här säger dokumentationen, vilket verkar helt logiskt. Citat:
|
Jag jobbar ju inte med Ruby men i de flesta programspråk jag kört genom åren så måste man alltid själv definiera ett "frö", men som du visade så var det tydligen redan gjort i den funktion du använde.
Exempelvis skulle koden: Kod:
numbers = new List<int>() { 23, 17, 13, 44, 51, 68, 37, 58, 9 }; I NET kan man lägga tilll följande kodelement för att själv styra fröet som styr slumpgenereringen. Static framför seed-variabeln gör att variabeln håller kvar sitt värde om den ligger som klassvariabel i en slumptalsklass, trots att man anropar slumpmetoden som en staticmetod, vilken var en liten behändig egenskap i sig. Kod:
static int seed = Environment.TickCount; Listan skulle likväl kunnat innehålla följande värden: Kod:
static int seed = Environment.TickCount; |
Citat:
Kod:
[23, 17, 13, 44, 51, 68, 37, 58, 9].shuffle |
Conny, hur menar du att Random() ger samma resultat om man kör det igen? Du måste inte ge något frö för att det inte ska bli samma som förut, och du behöver heller inte specificera Environment.Tickcount, för den är redan baserad på tid.
|
Fast du får nog kolla dokumentationen en gång till i Ruby, för jag sökte på: "Ruby Random Seed" och hittade följande artikel: http://www.ruby-forum.com/topic/158679
Där en programmerare hade konstaterat vad jag befarade skulle hända. Upprepade slumptal, när Random anropas flera gånger. |
Citat:
|
Citat:
Detta är inget ovanligt utan så har alla programspråk fungerat sedan jag först började programmera på slutet av 1970-talet. Nu har jag även konstaterat att Ruby inte är något undantag utan man måste initiera med ett "frö" för att hindra att slumpserien upprepas, det är fortfarande ingen garanti att talet är slumpmässigt men det är det bästa man kan åstadkomma i datorn idag. Sök på "Random seed" på internet så hittar du säkert massvis med artiklar just om detta fenomen. |
Citat:
"Ge samma resultat om man startar om programmet och kör igen. Det är det normala i de flesta pogramspråk." Vilket inte är sant. Skulle jag kopiera din kod och köra den två gånger i rad så finns det inte en chans i världen att det skulle bli samma resultat. Du får mer "säkerhet" genom att ange ett frö, eftersom ingenting är helt slumpmässigt (logiskt?), men TS behöver verkligen inte ange ett frö, och därför behöver du inte kommentera det, eller påstå att han måste/bör det. |
Här är en mer aktuell artikel om Ruby: http://ruby.about.com/od/newinruby19...rs-In-Ruby.htm
Men observera att jag inte tycker Ruby är "sämre" eller dåligt på att hantera slumptal, det är datorn som hårdvara som sätter gränsen för hur slumpmässigt ett ta l kan vara, så samma förutsättningar gäller för alla programspråk som körs på samma dator. Citat:
|
Citat:
Programmet använder något typ av matematisk formel för att beräkna ett tal som ska vara pseudoslumpmässigt. Matematik är per definition väldigt förutsägbart. men även på en kvantmekansisk nivå är datorn mycket förutsägbar. Det är bara vi människor som "upplever" att talen genereras slumpmässigt för att det är en så komplex formel att vi inte kan överblicka den med våra sinnen och intellekt. |
Och även jag säger samma sak, och gjorde det i min tidigare post. Det jag säger dock är att TS ej behöver ange ett frö, och du får det att verka som att det är absolut nödvändigt.
"// med ett slumpmässit frö annars får man upprepade serier av slumptal" "Dessutom måste man ha ett slumpfrö så slumpserien inte upprepas vid nästa körning." "men i de flesta programspråk jag kört genom åren så måste man alltid själv definiera ett "frö"" Det du säger är fel, och det var det jag poängterade. |
Det beror på vad man skall göra, skall man använda programmet i kommersiella syften ska man inte använda de vanliga random() funktionerna, oavsett språk. De genererar alldeles för dåliga slumptal. Många språk har bättre alternativ, Java och Ruby har SecureRandom, PHP har mt_rand() osv.
|
Jag tänkte inte ge mig in i debatten förutom att jag tror att Conny har fel i det här fallet. Man borde inte behöva ange seed när man skapar en ny instans av Random() eftersom den parameterlösa konstruktorn i sin tur anropar this(Environment.TickCount) vilket alltså ser ut att göra samma sak som att man själv skickar in värdet.
Vad Ruby har att göra i den här tråden där TS specifikt frågade efter C# har jag svårt att se. |
Citat:
Dessutom varierar det beroende på platform, PHP:s rand() på Windows brukar ge extremt dåliga slumptal, medans PHP:s rand() på Linux ger hyffsade tal. Men även om man seedar själv är det som sagt inte många standard PRNG:s som klarar en DieHard test: http://en.wikipedia.org/wiki/Diehard_tests |
Citat:
|
Här är lite mer artiklar om RNG-området, som ger utförligare bakgrundsförklaringar....
http://www.stat.fsu.edu/pub/diehard/ http://www.codeproject.com/Articles/...ber-Generation |
Alla tider är GMT +2. Klockan är nu 14:12. |
Programvara från: vBulletin® Version 3.8.2
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
Svensk översättning av: Anders Pettersson