sawMedlem sedan mars 20011 883 inlägg
Jag håller på med en statistik-sida och där ville jag ha lite staplar, inga problem. Jag har gjort några giffbilder, 0.gif, 1.gif osv till 9.
Nu ville jag slumpa fram färgerna. Allt ligger i en Repeater1.
//har kör jag
<%# getStatestic(Container.DataItem) %>
//och i kodebehind
public string getStatestic(object dataItem)
{
string stapelBild = "";
decimal sProcent = Convert.ToDecimal(DataBinder.Eval
(dataItem, "Procent").ToString());
string visaResult = "<table border=1 Class='counter' rules = 'none'>";
Random random = new Random();
int m = 0;
Random r = new Random(DateTime.Now.Millisecond);
for (int i = 0; i < 11; i++)
{
m = r.Next();
}
stapelBild = "../Bild/stapelBild/" + m + ".gif";
visaResult += "<tr><td><img src='" + stapelBild + "' border='1' height='
10' width='" + 5 * sProcent + "' runat='server'> " + Math.Round(sProcent, 2)
+ "%</td>";
visaResult += "</tr></table>";
return visaResult;
}
Här försöker jag med Random men resultatet blir att alla får samma färg.
Någon som har ett förslag på hur jag kan lösa detta? :q
nitro2k01Medlem sedan aug. 20037 630 inlägg
När jag såg denna tråd trodde jag att jag skulle behöva förklara vad pseudoslumptal är och att du måste seeda slumpgeneratorn. .net gör dock det automatiskt, och du behöver inte anropa new Random(DateTime.Now.Millisecond) utan new Random() räcker gott och väl.
Ditt problem är istället vad Next returnerar, nämligen ett värde mellan 0 och det högsta värdet en int kan lagra. Alltså, det är väldigt osannolikt att du alls får ett nummer i området 0-9. (C:a 0,00000023% om någon skulle råka vara intresserad.) Next har dock en andra variant som tar ett argument, nämligen hur många val som ska ges. Då ges ett slumpvärde i området 0 - (n-1). Alltså, om du anropar Next(5) så får du 0, 1, 2, 3 eller 4 som svar, vilket är totalt 5 alternativ.
sawMedlem sedan mars 20011 883 inlägg
Problemet är ju att alla får samma färg(tal), hur kan jag undvika detta?
plekanecMedlem sedan dec. 201028 inlägg
Random är lite skum tycker jag. Här är en lösning jag brukar köra men det kräver att du kör LINQ.
List<int> idList = new List<int>();
for (int i = 0; i < 11; i++)
{
idList.Add(i);
}
int randomNumber = idList.OrderBy(x => new Guid()).FirstOrDefault();
sawMedlem sedan mars 20011 883 inlägg
Tack för att du försöker men även det gav samma nummer till alla poster.
Det enda som jag nu har lyckats med är en väldigt ful lösning.
int iHits = Convert.ToInt32(DataBinder.Eval(dataItem, "id"));
string sHits = iHits.ToString();
int lengd = sHits.Length;
string newHits="";
if (lengd > 1)
newHits = sHits.Substring(lengd - 1);
else
newHits = sHits;
Detta fungerar med tanke på att jag tar den sista siffran i id:t men det kanske inte är så snygg lösning... §e
nitro2k01Medlem sedan aug. 20037 630 inlägg
saw: Kan du visa hur den resulterande HTML-koden ser ur när du kör med din originalkod fast med anrop till Next(5)?
sawMedlem sedan mars 20011 883 inlägg
Om jag har förståt dig rätt så ser det ut så här:
//efter visa källa
<table border=1 Class='counter' rules = 'none'><tr class='Light'>
<td><img src='../Bild/stapelBild/1.gif' border='1' height='10'
width='108,6900' runat='server'></td><td>7,25%</tr></table>
//och då genereras koden med
int m = 0;
Random r = new Random(DateTime.Now.Millisecond);
for (int i = 0; i < 11; i++)
{
m = r.Next(5);
}
stapelBild = "../Bild/stapelBild/" + m + ".gif";
Här är alltså någonting galet för att alla får nr: 1.
Vad det så här du ville se det?
En fråga till, var sparar VS sina filer? Jag har ändrat bilderna, givet de samma
namn men det är bara de gamla bilderna som dyker upp?
nitro2k01Medlem sedan aug. 20037 630 inlägg
Nu när jag funderar vidare på detta tror jag att jag inser vad problemet är. Du kör en slinga (for (int i = 0; i < 11; i++)) som inte fyller någon funktion. Du skriver ju bara ut en stapel per anrop. Och där ligger problemet. Du skapar ett nytt Random-objekt i varje anrop. Koden i sin helhet körs inom en millisekund, och alltså skapas varje Random-objekt med samma utgångsvärde. Därav följer att värdet du plockar ut blir detsamma.
Jag rekommenderar alltså att du flyttar skapandet av Random-objektet till det objekt som
getStatestic tillhör. Detta kräver att det bara finns en kopia av det objektet, annars får du samma problem igen, samma millisekund-värde.
// Deklarera r i objektscopet
Random r = new Random();
public string getStatestic(object dataItem)
{
string stapelBild = "";
decimal sProcent = Convert.ToDecimal(DataBinder.Eval
(dataItem, "Procent").ToString());
string visaResult = "<table border=1 Class='counter' rules = 'none'>";
Random random = new Random();
int m = 0;
// Bort med denna.
[s]Random r = new Random(DateTime.Now.Millisecond);[/s]
// Bort med denna loop om den inte används.
[s]for (int i = 0; i < 11; i++)
{[/s]
m = r.Next(5);
[s]}[/s]
stapelBild = "../Bild/stapelBild/" + m + ".gif";
visaResult += "<tr><td><img src='" + stapelBild + "' border='1' height='
10' width='" + 5 * sProcent + "' runat='server'> " + Math.Round(sProcent, 2)
+ "%</td>";
visaResult += "</tr></table>";
return visaResult;
}
Om du däremot får just 1 varje gång så är något annat fel.
sawMedlem sedan mars 20011 883 inlägg
JA, så skall det se ut, nu fungerar det. Jag antar att det berode på snurran...