Kirjautuminen

Haku

Tehtävät

Keskustelu: Ohjelmointikysymykset: Ryhmän jako

Viljelijä [01.04.2020 20:20:13]

#

Moi, aloitteleva ihminen kysyy, miten tehdä ohjelma jolla voisi jakaa noin 17 henkilön porukan sujuvasti kolmeen ryhmään. Mietin jo bingoa jossa arvottaisi numeroiden sijaan nimiä satunnaisotoksena. näin etä aikana olisi suotavaa kun ei luokkahuoneeseen päästä.Bingon ja biorytmin olen suorittanut, mutta kun siitä on jo 20 v aikaa. voiko joku vanhaa auttaa?

AtskaFin [01.04.2020 23:09:53]

#

Ajat loopin niin monta kertaa, kuin oppilaita on. Täytä ryhmiä järjestyksessä niin, että joka toistolla valitset yhden oppilaan satunnaisesti, jonka sijoitat ryhmään.

Esimerkkiohjelma (JS):

const jaaOppilaatRyhmiin = (oppilaat, ryhmienMäärä) => {
  let [oppilaatKopio, ryhmät] = [
    [...oppilaat],
    new Array(ryhmienMäärä)
  ];

  for (let i = 0; i < ryhmät.length; i++) {
    ryhmät[i] = [];
  }

  const toistot = oppilaatKopio.length
  for (let i = 0; i < toistot; i++) {
    const randomOppilasIndex = Math.floor(
      Math.random() * oppilaatKopio.length
    );

    ryhmät[i % ryhmienMäärä].push(
      ...oppilaatKopio.splice(randomOppilasIndex, 1)
    );
  }

  return ryhmät;
};

(() => {
  const oppilaat = [
    'Pera', 'Lauri', 'Olli', 'Kimi',
    'Eeli', 'Juha', 'Erkki'
  ];
  const ryhmienMäärä = 3;

  const ryhmät = jaaOppilaatRyhmiin(oppilaat, ryhmienMäärä);
  console.log(ryhmät);
})();

Ps. Tämän voisi siirtää pois projektit alueelta

Metabolix [02.04.2020 02:12:10]

#

Kaikkein nopein vaihtoehto on vain syöttää nimet johonkin lukuisista valmiista nettisivuista.

Helppo omatekoinen ratkaisu on taulukkolaskentaohjelman kuten Excelin käyttö: kun yhteen sarakkeeseen laittaa nimet ja toiseen sarakkeeseen joka riville satunnaisluvun (kaava RAND() tai suomeksi ilmeisesti SATUNNAISLUKU()), voi järjestää taulukon tämän satunnaisluvun mukaan ja ottaa sitten käsin oikean määrän nimiä kuhunkin ryhmään.

Ohjelmoinnin kannalta AtskaFin antoi jo ihan hyvän toteutuksen. Toinen ratkaisumalli on se, että ensin sekoitetaan ja sitten jaetaan ryhmät millä tahansa oikean lukumäärän tuottavalla tavalla. (Jos taulukko olisi suuri, tämä olisi myös tehokkaampaa, koska tässä vältetään taulukon muokkaaminen splice-funktiolla jokaisen alkion kohdalla. Tarvittaessa splicen voi välttää kokonaan, kun laittaa tilalle slicen ja laskurin siitä, mikä osa taulukosta on jo käsitelty.)

function jaaOppilaatRyhmiin(oppilaat, ryhmienMäärä) {
  // Sekoitetaan: jokainen [i] menee satunnaiseen kohtaan [0..i].
  let lista = [...oppilaat];
  for (let i = 1; i < lista.length; ++i) {
    let j = Math.floor(Math.random() * (i + 1));
    [lista[i], lista[j]] = [lista[j], lista[i]];
  }
  // Tehdään ryhmät sekoitetusta listasta yksinkertaisella jaolla.
  let ryhmät = [];
  while (lista.length) {
    let koko = Math.ceil(lista.length / (ryhmienMäärä - ryhmät.length));
    ryhmät.push(lista.splice(-koko));
  }
  return ryhmät;
}

console.log(jaaOppilaatRyhmiin(["Matti", "Maija", "Pena", "Uolevi"], 3));

Vastaus

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

Tietoa sivustosta