Generare numere aleatoare cu prioritati


MacromediaMX


Salut!
Sunt in ceata cu o chestie. Sa presupunem urmatoarea problema avand date fictive:
Am niste statistici care imi indica prioritatile unor oameni pentru anumite lucruri, concret:
1. 43% prefera carnea de porc
2. 26% prefera carnea de pui
3. 18% prefera carnea de vita
4. 10% la prefera carnea de miel
5. 3% (restul) prefera pestele

Bun, pana aici toate bune si frumoase. Insa acum sa zicem ca as vrea sa simulez chestia asta pe 500.000 de locuitori si vreau sa o fac folosind un script php. E foarte probabil ca oricare din cei 500.000 de locuitori sa consume doua sau mai multe tipuri de carne. M-ar interesa sa generez o optiune aleatoare (printr-un numar de la 1 la 5 conform datelor de mai sus) dar care sa tina cont de prioritatile de mai sus. In alte cuvinte sa am un rand(1,5), dar dupa 500.000 de generari, varianta 1 sa fie mai des intalnita deoarece are prioritate. Altfel spus, sa ajung la un numar cat mai apropiat de procentele de mai sus.
Sper ca m-am facut inteles.
Ceva idei are cineva?
Repet, ma intereseaza in php, nu in te miri ce programe de statistica cum ar fi SPSS. Trebuie sa fie vreo formula dupa care sa se poata calcula, dar nu o vad eu acum. Mersi
OriginalCopy
Salut.

Esti constient ca daca faci asta, statistica aia nu va mai fi acurata, nu? Daca ai face ce te gandesti tu sa faci, ar insemna sa constrangi modelul matematic sa se duca incotro vrei tu sa se duca, ori tu colectezi date de la useri si e pacat sa le limitezi "libertatea de exprimare" cand tu defapt vrei "date naturale". Neortodox!

Eu as zice in schimb sa faci procentajul normal, chiar daca trece de 100%, apoi sa faci procentajul relativ[1]. Daca in total ai avut 175% "votari pentru", si 100% pentru carnea de porc (oricare dintre optiuni nu va putea depasi 100%, e evident de ce, decat daca lasi utilizatorul sa voteze de mai multe ori), atunci procentajul relativ al optiunii 1 este 100/175*100=57.14% prefera carnea de porc.

Inca o nota: acel "procentaj total" va fi maxim nr_optiuni*100, deci 500% in cazul tau.

Cu metoda asta poti crea niste statistici mult mai interesante, si daca mai pui si o gaussiana peste poti verifica si cat de credibile sunt datele colectate. Bineinteles nu trebuie sa fie neaparat normala, te las pe tine sa te gandesti ce ai putea face (care este distribuția, varianța? wink.gif).

Edit:
Daca te tii de rezolvarea matematica te vei putea extinde usor catre mai multe statistici care raman consistente. Altfel risti sa ajungi la afirmatii de genul 87+54=100.

My .02$

[1] Suspectez ca defapt asta vrei, insa te-ai fixat pe o singura varianta fara sa te gandesti si la altceva mai matematic. cheers.gif
 
The@ngel
Calculezi numarul de inregistrari necesare pentru fiecare optiune in parte.
"Generezi" (nu stiu ce inseamna pentru tine asta) inregistrarile in ordine pentru fiecare tip.
Amesteci folosind rand ceea ce ai generat.
MacromediaMX
Sunt constient ca aplicand ceea ce am zis eu nu voi ajunge exact la acele procente, insa atata timp cat tind spre ele, e ok.
Nu am prea inteles concret ceea ce ai vrut sa zici acolo. Cum adica 175% votari pentru? Imi poti da, te rog, un exemplu mai detaliat?
@Th@ngel: la ceea ce ai zis tu sunt si mai in ceata.
Poate sunt batut in cap... insa va rog sa clarificati putin daca se poate.
Multumesc
OriginalCopy
QUOTE (MacromediaMX @ 24th October 2009, 02:59) *
Sunt constient ca aplicand ceea ce am zis eu nu voi ajunge exact la acele procente, insa atata timp cat tind spre ele, e ok.
Cred ca ai citit doar partea ingrosata de mai jos, dar nu ai inteles foarte bine ceea ce urmeaza sa scriu cu rosu:
QUOTE (OriginalCopy @ 23rd October 2009, 10:04) *
Salut.

Esti constient ca daca faci asta, statistica aia nu va mai fi acurata, nu? Daca ai face ce te gandesti tu sa faci, ar insemna sa constrangi modelul matematic sa se duca incotro vrei tu sa se duca, ori tu colectezi date de la useri si e pacat sa le limitezi "libertatea de exprimare" cand tu defapt vrei "date naturale". Neortodox!

Eu as zice in schimb sa faci procentajul normal, chiar daca trece de 100%, apoi sa faci procentajul relativ[1]. Daca in total ai avut 175% "votari pentru", si 100% pentru carnea de porc (oricare dintre optiuni nu va putea depasi 100%, e evident de ce, decat daca lasi utilizatorul sa voteze de mai multe ori), atunci procentajul relativ al optiunii 1 este 100/175*100=57.14% prefera carnea de porc.

Inca o nota: acel "procentaj total" va fi maxim nr_optiuni*100, deci 500% in cazul tau.

Cu metoda asta poti crea niste statistici mult mai interesante, si daca mai pui si o gaussiana peste poti verifica si cat de credibile sunt datele colectate. Bineinteles nu trebuie sa fie neaparat normala, te las pe tine sa te gandesti ce ai putea face (care este distribuția, varianța? wink.gif ).

Edit:
Daca te tii de rezolvarea matematica te vei putea extinde usor catre mai multe statistici care raman consistente. Altfel risti sa ajungi la afirmatii de genul 87+54=100.

My .02$

[1] Suspectez ca defapt asta vrei, insa te-ai fixat pe o singura varianta fara sa te gandesti si la altceva mai matematic. cheers.gif

Eu nu vad ce statistica e aia in care 87+54=100 rolleyes.gif
Cu siguranta nu as avea incredere in ea!

QUOTE (MacromediaMX @ 24th October 2009, 02:59) *
Nu am prea inteles concret ceea ce ai vrut sa zici acolo. Cum adica 175% votari pentru? Imi poti da, te rog, un exemplu mai detaliat?
Atunci cand userul bifeaza un checkbox, el afirma "sunt pro", cand nu o face atunci inseamna ori ca "sunt contra" sau "ma abtin". Asta inseamna "vot pentru".
Ai sesizat bine ca un utilizator poate vota pentru mai multe optiuni, deci daca din 10 utilizatori toti voteaza pentru optiunea 1, atunci optiunea 1 a fost aleasa cu un procentaj de 100%. La fel si pt optiunile 2,3,4,5.
Acum pune-le cap la cap si aduna-le: maximul total va fi de 500%. Logic pana aici?

Sa zicem ca 25% sunt pentru 1, 100% pentru 2, 10% pt 3, 35% pt 4 si 5% pentru optiunea 5.
In total asta face 175% "votari pentru". Din acestea:
25/175*100 = 14.28% sunt pt optiunea 1
100/175*100 = 57.14% pt optiunea 2
10/175*100 = 5.71% pt optiunea 3
35/175*100 = 20% pt optiunea 4
5/175*100 = 2.85% pt 5
14.28+57.14+5.71+20+2.85 = 99.98 ~~ 100%

Altfel spus: ai normalizat datele. Implicit: 1. nu s-au schimbat raporturile intre fiecare procent 2. nu ai ingradit parerea nimanui, pentru ca totul e relativ la acelasi punct fix.

Daca inventezi un parametru si te joci cu el printr-o formula si apoi generezi statistici cu acea formula, inseamna practic ca daca la inceput ai fi pus:
CODE
Alegeti una sau mai multe optiuni:
[ ] A
[ ] B
[ ] C

Din cauza acelui parametru pus dea-m-p notangel.gif ai afisa ceva de genul:
CODE
Alegeti una sau mai multe optiuni:
[ ] C

Ma rog, poate nu e vorba strict de afisare, e vorba de modelul matematic din spate! Asta inseamna:
QUOTE
Daca ai face ce te gandesti tu sa faci, ar insemna sa constrangi modelul matematic sa se duca incotro vrei tu sa se duca



QUOTE (MacromediaMX @ 24th October 2009, 02:59) *
insa atata timp cat tind spre ele, e ok.
Deci stai ca eu nu inteleg, tu ori lasi oamenii sa voteze liber si generezi statistica pentru ce vrei tu, ori vrei sa inseli sistemul ca sa-ti apara ce vrei tu, indiferent de ce voteaza oamenii? Ceea ce spui tu implica varianta a 2-a.


Oricum, mutat mai sus cu un etaj, ca tine de logica in general, nu strict de limbajul PHP.
MacromediaMX
Multumesc pentru detaliere, am inteles acum ce vrei sa zici.
Sa vad cum rezolv! smile.gif
Madest
Daca am inteles bine ce vrei tu sa faci, atunci codul asta ar trebui sa iti dea tot timpul niste procente aproape egale cu cele din exemplu.

CODE
<?php
for ($i=0; $i<43; $i++)
$array[$i] = 1;
for ($i=43; $i<69; $i++)
$array[$i] = 2;
for ($i=69; $i<87; $i++)
$array[$i] = 3;
for ($i=87; $i<97; $i++)
$array[$i] = 4;
for ($i=97; $i<100; $i++)
$array[$i] = 5;

$result = array(1=>0,2=>0,3=>0,4=>0,5=>0);

for ($i=0; $i<500000; $i++)
{
++$result[$array[rand(0,99)]];
}
for ($i=1; $i<6; $i++)
{
$percent = $result[$i]/5000;
echo ''.$result[$i].' = '.$percent.'%<br>';
}
?>
 
Aceasta este o versiune simplificată a paginii originale. Pentru a vizita versiunea originala click aici.