---
title: "Problem med random"
type: "forum-thread"
url: "https://www.webforum.nu/amne/dotnet/189480-problem-med-random"
topic: ".NET"
topic_url: "https://www.webforum.nu/amne/dotnet"
author: "saw"
published: "2012-03-18T21:10:52.000Z"
updated: "2012-03-19T15:37:20.000Z"
replies: 8
views: 796
page: 1
pages: 1
language: "sv-SE"
site: "webForum — webforum.nu"
rights: "Upphovsrätten till varje inlägg tillhör dess författare."
attribution: "Citera som: webForum, https://www.webforum.nu/amne/dotnet/189480-problem-med-random"
---

# Problem med random

## #1 — saw, 2012-03-18T21:10Z

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

Permalänk: https://www.webforum.nu/p/189480

## #2 — nitro2k01, 2012-03-19T05:33Z

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.

Permalänk: https://www.webforum.nu/p/2296840

## #3 — saw, 2012-03-19T10:18Z

Problemet är ju att alla får samma färg(tal), hur kan jag undvika detta?

Permalänk: https://www.webforum.nu/p/2296847

## #4 — plekanec, 2012-03-19T11:28Z

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();
```

Permalänk: https://www.webforum.nu/p/2296853

## #5 — saw, 2012-03-19T12:00Z

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

Permalänk: https://www.webforum.nu/p/2296854

## #6 — nitro2k01, 2012-03-19T12:49Z

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)?

Permalänk: https://www.webforum.nu/p/2296862

## #7 — saw, 2012-03-19T14:27Z

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?

Permalänk: https://www.webforum.nu/p/2296880

## #8 — nitro2k01, 2012-03-19T15:08Z

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.

Permalänk: https://www.webforum.nu/p/2296882

## #9 — saw, 2012-03-19T15:37Z

JA, så skall det se ut, nu fungerar det. Jag antar att det berode på snurran...

Permalänk: https://www.webforum.nu/p/2296884

---

Tråden på webben: https://www.webforum.nu/amne/dotnet/189480-problem-med-random
