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.