Kirjautuminen

Haku

Tehtävät

Keskustelu: Ohjelmointikysymykset: C#: Arpominen listasta?

Sivun loppuun

Keanna [19.02.2012 12:34:15]

#

Hei!

Osaatteko neuvoa, miten listasta saa arvottua string-tyyppisiä elementtejä? Mulla on ListItem, johon haen tietokannasta nimet, ja tuon listan sisällöstä olis sit tarkotus arpoa nimi tekstikenttään napinpainalluksella. Kielenä C#.

ListItem item = new ListItem();
item.Text = reader["Nimet"].ToString();

 Random rnd = new Random();
 //muuttuja johon arvotaan
 int n = rnd.Next(Convert.ToInt32(item.Text));

 TextBox1.Text = n.ToString();

Nappia painettaes tulee kuitenki virheilmoitus selaimeen "Syötemerkkijonon muoto ei ollut kelvollinen." joka viittaa tuohon int n -riviin.

Voisiko joku neuvoa mitä pitää tehdä toisin, oon aika avuton tämän arpomishomman kanssa.. -.-

Kiitos!!

neau33 [19.02.2012 14:19:40]

#

Moi Keanna!

rakentele oheisen esimekin pohjalta...

//esimerkki väännetty SharpDevevelop 4.0:lla
using System;
using System.Collections.Generic;
using System.Drawing;
using System.Windows.Forms;

namespace RandomTesti
{
   public partial class MainForm : Form
   {
      List<string> lst = new List<string>();
      Random rnd = new Random();

      //...

      void MainFormLoad(object sender, EventArgs e)
      {
         for(int i=1;i<=10;i++)
         {
            lst.Add("Nimi" + i.ToString());
         }
      }

      void Button1Click(object sender, EventArgs e)
      {
         textBox1.Text = lst[rnd.Next(0, lst.Count)];
                                   //(min,     max)
      }
   }
}

esim. täältä selviää miten pukata kama readerista listaan

groovyb [19.02.2012 15:01:37]

#

lainaus:

Msdn: The random number generation starts from a seed value. If the same seed is used repeatedly, the same series of numbers is generated.

Kun Random objekti luodaan, on hyvä asettaa muuttuva seed, esim:

Random rnd = new Random(new System.DateTime().Millisecond)

Keanna [19.02.2012 17:51:37]

#

Kiitos tuhannesti! :)

Neau33, jätin tuon for-rakenteen pois ja tein listaanlisäyksen tällä tavalla:

r.Add(item.ToString());

Toimii!

Pekka Karjalainen [19.02.2012 18:26:50]

#

groovyb kirjoitti:

lainaus:

Msdn: The random number generation starts from a seed value. If the same seed is used repeatedly, the same series of numbers is generated.

Kun Random objekti luodaan, on hyvä asettaa muuttuva seed, esim:

Random rnd = new Random(new System.DateTime().Millisecond)

Itse asiassa oletusmuodostimessa näyttäisi jo olevan tällainen ominaisuus.

http://msdn.microsoft.com/en-us/library/h343ddh9.aspx

lainaus:

Initializes a new instance of the Random class, using a time-dependent default seed value.

Usein käytetty Random-luokan instanssi kannattaa tietenkin laittaa talteen, eikä luoda joka kerta uudelleen.

Keanna [27.02.2012 17:00:23]

#

Kokeilin siis myös tuolla for-lauseella ja siitä tuli mieleensemmoset kysymykset vielä, että miks joidenkin nimien peräs näkyy numero, kun ne on arvottu tekstikenttään kun tarkoitus olis kuitenkin näyttää vain pelkkä nimi?

Toinen kysymys, että kun arvotun nimen koittaa tulostaa listboxiin, niin sinne tulostuu kuitenkin kaikki nimet ja useampaan kertaa ja jotkut kera numeron nimen lopussa. Mistä tämä voisi johtua? Lisäys tapahtuu näin:

ListBox1.Items.Add(r[index]);

groovyb [27.02.2012 17:54:01]

#

Kai muistit tyhjentää listan aina ennenkuin arvot uuden kerran?
Ja jos tosiaan käytät luokan alussa luotua randomia, seed ei muutu. Eli ennen jokaista arpomiskierrosta jona täytät listan tulisi objekti luoda uudestaan. Jos mukana tulee numeroita listaan, collectionisi sisältää myös tekstiä numeroilla. Tarkasta listasi sisältö.

Huomaa että tuossa esimerkissä arvotaan loopilla, eli pitääkin tulla enemmän kuin yksi tulos koska n kertaa arvotaan ja lisätään. Ja koska arvotaan, voi sama tulos tulla kaksi kertaa ellet tarkasta onko arvottu tulos jo listassa.

Keanna [27.02.2012 18:32:51]

#

Joo tuon tyhjäyshomman hoksasin tehdä. Ja noita numeroita ei tuu, jos en käytä sitä for-lausetta. Jäi vaan ihmetyttämään..

No vielä yksi kysymys tietyn määrän arpomisesta. Kun siis haen listaan kaikki nimet (22 kpl) tietokannasta, niin tuosta joukosta pitäis arpoa 7 nimeä listboxiin ja koitin tehdä tämän do-while rakenteella näin:

do
 {
     int index;
     Random rnd = new Random();

     index = rnd.Next(0, r.Count); //(min, max)
     ListBox1.Items.Add(r[index]);

 } while (ListBox1.Items.Count <8);

Mutta sinne tulostuu tästä huolimatta yli 7 itemiä.. en oo siis nyt käyttäny sitä for-lausettakaan ettei siitä ainakaan johdu. :S

Metabolix [27.02.2012 18:43:28]

#

Niin, no tuossahan arvot aivan yksiselitteisesti 8 kohtaa. Koodissasi lukee "while (count < 8)", suomeksi "niin kauan, kuin kohtia on alle 8".

Keanna [28.02.2012 10:55:19]

#

Kokeilin myös (count == 7), mutta silläkin tuli enemmän kuin olisi tarkoitus. o.O

makumaku [28.02.2012 11:07:30]

#

No tietenkin tulee sama määrä, koska (count == 7) ja (count < 8) ovat sama asia.
Ota vaikka kynä ja paperia, tai laske ihan sormin kierros kierrokselta että miten monta kierrosta tuo looppi pyörii. Ei pitäisi olla ylivoimainen tehtävä.

Jos jo looppiin mennessä tiedät että tarvitset aina 7 itemia, niin miksi et käytä for-looppia? Tietenkin sen voi tehdä do-while-loopillakin, mutta mielestäni for olisi aavistuksen loogisempi.

Grez [28.02.2012 12:14:06]

#

makumaku kirjoitti:

No tietenkin tulee sama määrä, koska (count == 7) ja (count < 8) ovat sama asia.

No ei kyllä pitäisi olla. Toki kokonaisluvuille <= 7 ja < 8 ovat sama asia, mutta ei == 7 ja < 8.

makumaku [28.02.2012 12:42:09]

#

Joo sorry, copy-pastesin näköjään ilman tarkempaa katsomista ja miettimistä. Siis tosiaan siinä olikin == -vertailu, eikä <=

Metabolix [28.02.2012 16:37:18]

#

Mitä jos nyt palaisit alkeisiin ja tekisit ensin silmukan, joka tulostaa kokonaisluvut 1–7? Sitten voit laittaa kyseiseen silmukkaan luvun tulostamisen tilalle tuon listan kohdan lisäämisen, niin kohtia tulee oikea määrä.

Keanna [02.03.2012 18:14:01]

#

Kiittistä vaan! For-lauseellahan se lähtikin pelittään. :)


Sivun alkuun

Vastaus

Aihe on jo aika vanha, joten et voi enää vastata siihen.

Tietoa sivustosta