Jag har en frågelek som bygger på att slumpa fram 10 olika frågor ur en
access databas. Den fungerade perfekt i klassisk ASP men nu har jag problem
med att slumpa nya frågor dvs första gången så går det bra, men vill man
spela igen så blir det samma frågor.
Så här ser i stort sett hela klassen ut
oid loadWizar()
{
string sql = "SELECT MAX(id) AS maxid FROM Quize";
OleDbCommand myCommand = new OleDbCommand(sql, DBConn);
int max = 0;
using (DBConn)
{
DBConn.Open();
max = (int)myCommand.ExecuteScalar();
}
if (max == 0)
try { }
catch
{
throw;
}
List<int> col = new List<int>();
Random rnd = new Random();
for (int i = 0; i < 10; i++)
{
int x;
do
{
x = rnd.Next(1, max);
}
while (col.Contains(x));
col.Add(x);
}
DBConn.Close();
sql = "SELECT Quize.Id, Quize.Fraga, Quize.Allt1, Quize.Allt2, Quize.Allt3, Quize.Svar, Quize.Ratt FROM Quize ";
sql += " WHERE Quize.Id IN( ";
int k = 1;
foreach (int i in col)
{
if (k != 10)
sql += i.ToString() + ",";
else
sql += i.ToString();
k += 1;
}
sql += " )";
Response.Write(sql);
DBConn = new OleDbConnection(ConfigurationManager.ConnectionStrings["ConnectionString"].ConnectionString);
DataTable dt = Webbutill.fillDataTable(DBConn, sql);
if (dt.Rows.Count > 0)
{
makeQuize(Lfraga_1,RadioButtonList1,"svar1",dt,0);
makeQuize(Lfraga_2, RadioButtonList2, "svar2", dt, 1);
makeQuize(Lfraga_3, RadioButtonList3, "svar3", dt, 2);
makeQuize(Lfraga_4, RadioButtonList4, "svar4", dt, 3);
makeQuize(Lfraga_5, RadioButtonList5, "svar5", dt, 4);
makeQuize(Lfraga_6, RadioButtonList6, "svar6", dt, 5);
makeQuize(Lfraga_7, RadioButtonList7, "svar7", dt, 6);
makeQuize(Lfraga_8, RadioButtonList8, "svar8", dt, 7);
makeQuize(Lfraga_9, RadioButtonList9, "svar9", dt, 8);
makeQuize(Lfraga_10, RadioButtonList10, "svar10", dt, 9);
}
Problemet är Random() som inte är slumpmässig i det avseende som du tror, det är faktiskt i en speciell följd och det är så för att man skall kunna debuga sin kod och göra felsökningar.
För att få det någolunda slumpmässigt så måste du änvända dig av ett för (seed) när du skapar din Random-klass och millisekunder är ett bra värde för det.
Random rand = new Random(DateTime.Now.Millisekund);
Eller något sådant. Det kommer ju aldrig bli helt slumpmässigt eftersom om du efterfrågar på exakt samma millisekund så kommer samma ordningsföljd upp. Men bättre än så kan du inte få det :)
För att få det någolunda slumpmässigt så måste du änvända dig av ett för (seed) när du skapar din Random-klass och millisekunder är ett bra värde för det.
Problemet är tydligen någonting annat dumt som jag har gjort, jag gjorde en testsida
med koden ovan och då fungerade random perfekt(kollade sql). Kan det vara någon
catch som ligger och gör dumheter?
Jag har nu "lyckats" på ett sätt som jag inte tycker om. x(
Jag fick först ta bort Ajax asp:UpdatePanel, sedan fick jag lägga till en ny
knapp som slumpade nya frågor och som disablades när man börjar
frågesporten.
Det fungerar men inte snyggt... :q
503 ms totalt · 4 externa anrop · v20260731065814-full.86ec41c2