Meddelande

Minska
No announcement yet.

Problem med random

Minska
X
 
  • Filter
  • Klockan
  • Show
Clear All
new posts

  • Problem med random

    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.
    [kod]
    //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;
    }
    [/kod]
    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?
    saw
    _______________________
    www.saw.se
    _______________________

  • #2
    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.
    Gameboy Genius - Foto: Gatukonst och elektronikporr
    Internklippning:
    1) Snaggning av fångar.
    2) Klippning frisörer emellan.

    Kommentera


    • #3
      Problemet är ju att alla får samma färg(tal), hur kan jag undvika detta?
      saw
      _______________________
      www.saw.se
      _______________________

      Kommentera


      • #4
        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.

        Kod:
        List<int> idList = new List<int>();
        
        for (int i = 0; i < 11; i++)
        {
            idList.Add(i);
        }
        
        int randomNumber = idList.OrderBy(x => new Guid()).FirstOrDefault();

        Kommentera


        • #5
          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.
          [kod]
          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;[/kod]
          Detta fungerar med tanke på att jag tar den sista siffran i id:t men det kanske inte är så snygg lösning...
          saw
          _______________________
          www.saw.se
          _______________________

          Kommentera


          • #6
            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)?
            Gameboy Genius - Foto: Gatukonst och elektronikporr
            Internklippning:
            1) Snaggning av fångar.
            2) Klippning frisörer emellan.

            Kommentera


            • #7
              Om jag har förståt dig rätt så ser det ut så här:
              [kod]
              //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";
              [/kod]
              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?
              saw
              _______________________
              www.saw.se
              _______________________

              Kommentera


              • #8
                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.

                [kod]
                // 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.
                Random r = new Random(DateTime.Now.Millisecond);

                // Bort med denna loop om den inte används.
                for (int i = 0; i < 11; i++)
                {

                m = r.Next(5);
                }

                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;
                }[/kod]

                Om du däremot får just 1 varje gång så är något annat fel.
                Gameboy Genius - Foto: Gatukonst och elektronikporr
                Internklippning:
                1) Snaggning av fångar.
                2) Klippning frisörer emellan.

                Kommentera


                • #9
                  JA, så skall det se ut, nu fungerar det. Jag antar att det berode på snurran...
                  saw
                  _______________________
                  www.saw.se
                  _______________________

                  Kommentera

                  Working...
                  X