Pagina 1 di 1
[risolto] [PHP] Ripartizione casuale di un numero
Inviato: domenica 14 giugno 2015, 13:34
da IL BaK
Sto scrivendo uno script PHP che deve semplicemente ripartire un numero e penso di star complicando troppo le cose, chiedo a voi.
Avendo un numero iniziale lo si vorrebbe ripartire in dei numeri proporzionali. La divisione però deve essere casuale, ad esempio:
Numero iniziale 10
Lo possiamo ripartire in: 5, 3, 2 altrimenti in 8, 1, 1 o anche 4, 4, 2...
Re: PHP - Ripartizione casuale di un numero
Inviato: domenica 14 giugno 2015, 13:49
da gila75
Ciao, io studio il C, quindi in php non saprei.
Ci saranno metodi più raffinati, ma per così poco (3 numeri per avere la somma di x), userei il brute force:
Pesca tre numeri nel range di 0-10, finchè la loro somma è uguale a 10.
Prima pesca: 5,5,2=12
rifaccio...ecc..
Tanto vedo che puoi avere numeri doppi per avere la somma, una complicazione in meno no?
Re: PHP - Ripartizione casuale di un numero
Inviato: domenica 14 giugno 2015, 14:41
da SuperStep
in realtà ci sarebbe anche un algoritmo gready.
Se io inizialmente pesco 6. Qualsiasi numero > 6 non mi fa ottenere 10. Quindi devo ricercare in quelli di (10 - 6) ovvero fra 1,2,3,4.
Estrai il primo numero randomico da 0 a MAX_INTERVAL (lo chiamiamo N0).
poi peschi un altro numero compreso fra 0 e (MAX_INTERVAL - N0). (lo chiamiamo N1).
poi peschi un altro numero compreso fra 0 e (MAX_INTERVAL - N1). (lo chiamiamo N2).
Così finchè il numero estratto non è 1.
[EDIT]
Così finchè il numero estratto non è 0.
[EDIT #2]
Così finchè Nn non è 0
Re: PHP - Ripartizione casuale di un numero
Inviato: domenica 14 giugno 2015, 15:20
da M_A_W_ 1968
Questo thread contiene quasi esattamente quel che serve all'OP, con una completa soluzione in PHP. Si tratta banalmente di adattarla per selezionare una partizione pseudorandom, e anche in questo i riferimenti disseminati nel thread possono guidare rapidamente alla soluzione.
Re: PHP - Ripartizione casuale di un numero
Inviato: domenica 14 giugno 2015, 16:54
da gila75
@M_A_W però io non credo che lui voglia tutte le possibilità, o almeno così non mi pare da come si è espresso.
Se è per tutti i casi, è un conto se per uno solo, chredo che il "costo" del brute force sia trascurabile, non credi?
Re: PHP - Ripartizione casuale di un numero
Inviato: domenica 14 giugno 2015, 17:27
da M_A_W_ 1968
L'OP ha bisogno di scegliere una partizione pseudocasuale di un numero intero positivo. Esistono algoritmi appositi, e c'è perfino una soluzione pressoché finita nel linguaggio richiesto. Il che è in definitiva un'ottima occasione per imparare qualcosa e pensare realmente da informatico, invece di limitarsi a risolvere alla bell'e meglio un problema contingente con una patacca ad hoc.
L'informatica applicativa, ma anche l'elettronica e molte altre discipline ingegneristiche affini, in fondo consistono proprio di questo: una sana dose di teoria e pacchi di best practices, soluzioni intelligenti che è sempre il caso di riciclare e riadattare, invece di reinventare la ruota ogni volta.
Poi ci sono i problemi davvero difficili, gli algoritmi più ostici, le strutture dati più complesse, l'ottimizzazione estrema, i sistemi altamente critici regolati da norme internazionali, i progetti di grande respiro, l'hardware custom... e lì ci vuole davvero l'esperto. Ma questa è un'altra storia.
Re: PHP - Ripartizione casuale di un numero
Inviato: domenica 14 giugno 2015, 17:56
da gila75
Il che è in definitiva un'ottima occasione per imparare qualcosa e pensare realmente da informatico, invece di limitarsi a risolvere alla bell'e meglio un problema contingente con una patacca ad hoc.
Diretto come al solito

Re: [PHP] Ripartizione casuale di un numero
Inviato: mercoledì 17 giugno 2015, 20:27
da IL BaK
RIngrazio tutti per gli interventi, preziosissimi e che mi hanno dato spunti di approfondimento (come nell'intervento di MAW, anche se penso che la possibilità di arrivare ad una soluzione in diversi modi non dia per scontanto che la tecnica sia meglio di una soluzione logica, ma è un'opinione personale e un altro discorso

).
Codice: Seleziona tutto
while ( ($a+$b+$c) < $totale ) {
$add = rand(1, 3);
switch ($add) {
case 1:
if ($a < $max ) { $a++; }
break;
case 2:
if ($b < $max ) { $b++; }
break;
case 3:
if ($c < $max ) { $c++; }
break;
}
}