Kom ihåg mig?
Home Menu

Menu


5 siffror i slumpmässig ordning? asp.net c#

 
 
Ämnesverktyg Visningsalternativ
Oläst 2012-12-01, 00:38 #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 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
naak2803 är inte uppkopplad   Svara med citatSvara med citat
Oläst 2012-12-01, 01:57 #2
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
lyckades komma på lösningen själv...

Kod:
Random random = new Random();
        var nums = new List<int>() { 1, 2, 3, 4, 5, 6, 7, 8, 9};
        List<int> result = new List<int>();

        int iNumberOfSlides = nums.Count;

        while (nums.Count > 0)
        {
            int idx = random.Next(0, nums.Count);
            result.Add(nums[idx]);
            nums.RemoveAt(idx);
        }

        string sHTML = string.Empty;

        for (int i = 0; i < iNumberOfSlides; i++)
            sHTML += "<a href='#'><img src='Images/Sliders/" + result[i].ToString() + ".jpg' /></a>";
kanske inte smidigaste sättet.. men men.. it works!
naak2803 är inte uppkopplad   Svara med citatSvara med citat
Oläst 2012-12-02, 02:42 #3
Conny Westh Conny Westh är inte uppkopplad
Klarade millennium-buggen
 
Reg.datum: Aug 2005
Inlägg: 5 166
Conny Westh Conny Westh är inte uppkopplad
Klarade millennium-buggen
 
Reg.datum: Aug 2005
Inlägg: 5 166
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
// Author: Conny Westh
// Date Created: 2012-12-02
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace wn.random.number
{
	class Program
	{
		static void Main(string[] args)
		{
			List<int> numbers;

			Console.WriteLine("Test av slumptal...");
			Console.WriteLine();

			// Testa slumpfunktionen många gånger för att se att 
			// den inte upprepas i regelbundna mönster....
			for (int n = 0; n < 17; n++)
			{
				// Tänk på att skapa ny lista varje gång annars blir det knas...
				numbers = new List<int>() { 1, 2, 3, 4, 5, 6, 7, 8, 9 };
				foreach (int i in RandomNumber.SortIntItemsRandomly(numbers))
				{
					Console.Write(String.Format("{0} ", i));
				}
				Console.WriteLine();
			}

			Console.WriteLine();
			Console.WriteLine("Press any key to exit...");
			Console.ReadKey();
		}
	}
}
Sen kommer funktionen som TS är ute efter....
Kod:
// Class: RandomNumber
// Author: Conny Westh
// Date Created: 2012-12-02
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace wn.random.number
{
	public class RandomNumber
	{
		public static List<int> SortIntItemsRandomly(List<int> nums)
		{
			Random random = new Random();
			List<int> result = new List<int>();

			int iNumberOfSlides = nums.Count;

			while (nums.Count > 0)
			{
				// Funkar inte så bra, för random måste initieras 
				// med ett slumpmässit frö annars får man upprepade serier av slumptal
				//int idx = random.Next(0, nums.Count); 

				// Dett afunkar bättre med den funktion jag använder, 
				// blir mer oförutsägbart resultat....
				int idx = Slump.slumpInt(0, nums.Count);
				result.Add(nums[idx]);
				nums.RemoveAt(idx);
			}
			return result;
		}
	}
}
Sen kommer min egen Slu,p-klass som jag skapade i våras, som ser till att slumpmässigheten blir lite bättre ....
Kod:
// Class: Slump
// Author: Conny Westh
// Date Created: 2012-05-23
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace wn.random.number
{
	public static class Slump
	{
		private static int seed = Environment.TickCount;
		public static double slumptal
		{
			get
			{
				Random rnd = new Random(seed++);
				return rnd.NextDouble();
			}
		}

		public static int slumpInt(int low, int high)
		{
			Random rnd = new Random(seed++);
			int range = high - low;
			if (range <= 0)
			{
				return low;
			}
			else
			{
				return (rnd.Next() % range) + low;
			}
		}

		public static long slumpLong(long low, long high)
		{
			Random rnd = new Random(seed++);
			long range = high - low;
			if (range <= 0L)
			{
				return low;
			}
			else
			{
				return (rnd.Next() % range) + low;
			}
		}

	}
}
Den här koden är skapad i en Console-applikation för att vara lätt att testa, men det är bara att strunta i att ta med Program-klassen så kan man använda de andra två i sina webbprojekt, eftersom de inte innehåller någon interaktion med Consolen, utan är helt "rena" klasser (dvs rena från UI-kod) och de är därför återanvändbara i många olika sammanhang.

Namespace kan ju ändras till valfritt, eftersom det inte är något som krävs i övrigt av klasserna.
Conny Westh är inte uppkopplad   Svara med citatSvara med citat
Oläst 2012-12-02, 03:41 #4
yakuzaemmes avatar
yakuzaemme yakuzaemme är inte uppkopplad
Mycket flitig postare
 
Reg.datum: Jun 2012
Inlägg: 773
yakuzaemme yakuzaemme är inte uppkopplad
Mycket flitig postare
yakuzaemmes avatar
 
Reg.datum: Jun 2012
Inlägg: 773
Kod:
class MittProgram
    {
        static Random Rand = new Random();
        static List<String> Sliders = new List<String>();
        static void Main(string[] args)
        {
            AddSliders();
            String MyHTML = SliderHTML();
        }

        static void AddSliders()
        {
            for (Int32 x = 0; x < 10; x++)
            {
                String Current = String.Empty;
                for (Int32 i = 0; i < 5; i++)
                {
                    Int32 Num = Rand.Next(1, 6);
                    while (Current.Contains(Num.ToString()))
                    {
                        Num = Rand.Next(1, 6);
                    }
                    Current += Num.ToString();
                }
                Sliders.Add(Current);
            }
        }
        static String SliderHTML()
        {
            String sHTML = String.Empty;
            foreach (String slider in Sliders)
                sHTML += "<a href='#'><img src='Images/Sliders/" + slider + ".jpg'/></a>";
            return sHTML;
        }
    }
.
yakuzaemme är inte uppkopplad   Svara med citatSvara med citat
Oläst 2012-12-02, 06:45 #5
Conny Westh Conny Westh är inte uppkopplad
Klarade millennium-buggen
 
Reg.datum: Aug 2005
Inlägg: 5 166
Conny Westh Conny Westh är inte uppkopplad
Klarade millennium-buggen
 
Reg.datum: Aug 2005
Inlägg: 5 166
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;
numbers = new List<int>() { 1, 2, 3, 4, 5, 6, 7, 8, 9 };
var rnd = new Random(seed++);
numbers = numbers.OrderBy(x => rnd.Next()).ToList();

Senast redigerad av Conny Westh den 2012-12-02 klockan 07:00
Conny Westh är inte uppkopplad   Svara med citatSvara med citat
Oläst 2012-12-02, 15:03 #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
Å här är samma lösning i Ruby

Kod:
(1..5).to_a.shuffle
Nerix är inte uppkopplad   Svara med citatSvara med citat
Oläst 2012-12-02, 21:46 #7
Conny Westh Conny Westh är inte uppkopplad
Klarade millennium-buggen
 
Reg.datum: Aug 2005
Inlägg: 5 166
Conny Westh Conny Westh är inte uppkopplad
Klarade millennium-buggen
 
Reg.datum: Aug 2005
Inlägg: 5 166
Citat:
Ursprungligen postat av Nerix Visa inlägg
Å här är samma lösning i Ruby

Kod:
(1..5).to_a.shuffle
Det löser inte problemet, eftersom TS vill ha en array med valfria värden. Det är inte som i exemplet bara att räkna upp siffrorna 1-5. Dessutom måste man ha ett slumpfrö så slumpserien inte upprepas vid nästa körning.
Conny Westh är inte uppkopplad   Svara med citatSvara med citat
Oläst 2012-12-02, 22:29 #8
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 ConnyWesth Visa inlägg
Dessutom måste man ha ett slumpfrö så slumpserien inte upprepas vid nästa körning.
Så du menar att Array#shuffle returnerar samma serie om den körs två gånger efter varandra?

Det är ju inte så att implementeringen ser ut så här.



Så här säger dokumentationen, vilket verkar helt logiskt.

Citat:
By default, the parameterless constructor of the System.Random class
(which is what "rand" is using) uses the system time as the initial seed.
Every time you ask for a random number, we create a new Random object.
Nerix är inte uppkopplad   Svara med citatSvara med citat
Oläst 2012-12-02, 22:36 #9
Conny Westh Conny Westh är inte uppkopplad
Klarade millennium-buggen
 
Reg.datum: Aug 2005
Inlägg: 5 166
Conny Westh Conny Westh är inte uppkopplad
Klarade millennium-buggen
 
Reg.datum: Aug 2005
Inlägg: 5 166
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 };
var rnd = new Random();
numbers = numbers.OrderBy(x => rnd.Next()).ToList();
Ge samma resultat om man startar om programmet och kör igen. Det är det normala i de flesta pogramspråk.

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;
var rnd = new Random(seed++);
Men däremot så var funktionen felaktig utifrån kravet, det gör inte vad kravställaren vill. Dvs väljer ett slumpmässigt element från en angiven lista där varje element är en int. Din lista visade bara siffrorna 1-5. utan någon initiering från användaren med valfria värden.

Listan skulle likväl kunnat innehålla följande värden:
Kod:
static int seed = Environment.TickCount;
var rnd = new Random(seed++);
numbers = new List<int>() { 23, 17, 13, 44, 51, 68, 37, 58, 9 };
numbers = numbers.OrderBy(x => rnd.Next()).ToList();
Nog om slumptal. Visa gärna hur du initierar med valfria heltalsvärden i en array i stället.

Senast redigerad av Conny Westh den 2012-12-02 klockan 22:50
Conny Westh är inte uppkopplad   Svara med citatSvara med citat
Oläst 2012-12-02, 23:00 #10
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 ConnyWesth Visa inlägg
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 };
var rnd = new Random();
numbers = numbers.OrderBy(x => rnd.Next()).ToList();
Ge samma resultat om man startar om programmet och kör igen. Det är det normala i de flesta pogramspråk.

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;
var rnd = new Random(seed++);
Men däremot så var funktionen felaktig utifrån kravet, det gör inte vad kravställaren vill. Dvs väljer ett slumpmässigt element från en angiven lista där varje element är en int. Din lista visade bara siffrorna 1-5. utan någon initiering från användaren med valfria värden.

Listan skulle likväl kunnat innehålla följande värden:
Kod:
static int seed = Environment.TickCount;
var rnd = new Random(seed++);
numbers = new List<int>() { 23, 17, 13, 44, 51, 68, 37, 58, 9 };
numbers = numbers.OrderBy(x => rnd.Next()).ToList();
Nog om slumptal. Visa gärna hur du initierar med valfria heltalsvärden i en array i stället.
Kod:
[23, 17, 13, 44, 51, 68, 37, 58, 9].shuffle
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 06:34.

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