Kirjautuminen

Haku

Tehtävät

Keskustelu: Ohjelmointikysymykset: C++: kehittynyt random

Touho [14.01.2005 18:35:35]

#

miten saan c++: ssa satunnaisluvun väliltä 1-100 sillälailla, että 1 on vähiten todennäköinen ja 100 todennäköisin?

Mielellään semmonen keino, jolla pystyy säätelemään lukujen todennäköisyyden suhdetta.

Antti Laaksonen [14.01.2005 19:40:29]

#

Päätä jokaisen arvottavan luvun todennäköisyys ja pane tiedot taulukkoon. Sitten arvo tavalliseen tapaan luku väliltä 0 - 100. Käy taulukkoa läpi, kunnes siihen asti tarkistettujen lukujen todennäköisyyksien summa on suurempi kuin arvottu luku. Silloin saat selville lopullisen luvun.

Touho [14.01.2005 19:46:24]

#

Voisitko selkeyttää jotenkin antamalla vaikka esimerkin tageilla?

Grey [14.01.2005 20:20:36]

#

Itselleni tuli tässä miettiessäni muuan toinen tapa arpoa nuo luvut, ilman että pitäisi jokaisen luvun tulemisen todennäköisyyttä laittaa taulukkoon. Tietäisi melkoisesta työtä moinen, varsinkin jos luvut ovat väliltä 1-1000000 :-D

Kuitenkin, tapa olisi sellainen että on vain kaksi lukua, joista ensimmäinen osoittaa pienimmän (1) todennäköisyyttä ja toinen suurimman (100) todennäköisyyttä. Välissä olevien todennäköisyys sitten lasketaan jollain sopivalla kaavalla. En tosin tiedä kaavaa, mutta kai sellainen sopiva on jossain olemassa..

-Grey-

Metabolix [14.01.2005 20:50:15]

#

Tuo on tosiaan helpompi tapa, jos todennäköisyys saa olla tasaisesti kasvava, mutta jos sen haluaa vaihtelevammaksi...
Jos haluat luvun väliltä 0 - x, arvo luku 0 - xy ja ota siitä juuri y eli korota se potenssiin (1/y). Juuren suuruus määrää, minkä verran lukujen todennäköisyys eroaa. Voit sitten tarkistaa, että niitä lukuja tosiaan tulee sopivalla tavalla vaikkapa laskemalla, montako kertaa miljoonan arvonnan aikana saat luvut 1, 33, 66 ja 100.

Touho [14.01.2005 21:37:28]

#

oon yrittänyt tässä koko illan saada tota Antin systeemiä toimimaan, mutta se antaa hassuja arvoja. vaikeaa saada toimimaan.

Sami [15.01.2005 01:10:37]

#

Javalla tehty hieman säätö...
Funktio hieman_painotettu_satunnaisluku() arpoo luvun väliltä ala-yla ja painotuksen voi laittaa joko suuriin tai pieniin lukuihin.

Suuremmilla n arvoilla painotus on suurempi ja myös laskemisessa kestää hieman pidemmän aikaa.

Alussa myös koodinpätkä, joka arpoo miljoona lukua ja tulostaa jakauman.

public class rnd {
	public static void main(String[] args) {
		int[] luvut = new int[101];

		for (int i = 0; i < 1000000; i++) {
			int luku = hieman_painotettu_satunnaisluku(1, 100, false);
			luvut[luku]++;
		}

		for (int i = 0; i < luvut.length; i++) {
			System.out.println(i + ": " + luvut[i]);
		}
	}

	public static int hieman_painotettu_satunnaisluku(int ala, int yla, boolean suurempi_todennakoisyys_alapaassa) {
		double summa = 0;
		int n = 2;
		for (int i = 0; i < n; i++) {
			summa += Math.random();
		}

		int luku = (int)(Math.abs((summa - (double)n/2) * yla)/((double)(n/2)) + ala); //itse lasku

		if (suurempi_todennakoisyys_alapaassa) return luku;
			else return yla - luku + ala;
	}
}

Vastaus

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

Tietoa sivustosta