Un insieme casuale la cui somma faccia uno?

Problemino per voi:

  1. prendi un numero (float) in input: total
  2. prendi un numero (int) in input: nr_days
  3. crea un array con un numero di elementi pari a nr_days: days
  4. distribuisci total tra gli elementi di days in in maniera casuale
    di modo che la somma sia uguale a total
    esempio:
 total = 100
 nr_days = 5
 days   =   fa_la_cosa_magica()
 # days = [30, 13 , 7, 26, 24]
 check   =   0
 days.each{|d|
     check   +=   d
 }
 unless check == total
     urla_di_dolore_and_strappa_capelli
 end
 puts days.to_s

Come fareste?

prendi un numero a caso fra 1 e 100, e gli altri li prendi fra 1 e 100 -
la
somma dei precedenti.
Grosso modo dovrebbe andare

----- Original Message -----
From: “david” [email protected]
To: “ruby-it” [email protected]
Sent: Monday, February 26, 2007 7:58 PM
Subject: [ruby-it] un insieme casuale la cui somma faccia uno?

nr_days = 5

Come fareste?

“Every normal man must be tempted at times to spit upon his hands, hoist
the bl
ack flag, and begin slitting throats.” - H.L. Mencken


Nah, era quello che avevo provato. Il problema è che la “varianza”
diminuisce man mano che pigli numeri random e diminuisci il max
possibile.
primo giro (total = 100):
days[0] = rand(total) #30?
total -= days[0]
al secondo secondo giro hai total = 70 e non possono capitare numeri
da 70 in sù… al terzo giro è peggio ancora… ecc
Altre idee?

stb wrote:

 prendi un numero a caso fra 1 e 100, e gli altri li prendi fra 1 e
 100 - la somma dei precedenti.
 Grosso modo dovrebbe andare
 ----- Original Message ----- From: "david"
 [1]<[email protected]>
 To: "ruby-it" [2]<[email protected]>
 Sent: Monday, February 26, 2007 7:58 PM
 Subject: [ruby-it] un insieme casuale la cui somma faccia uno?

   Problemino per voi:
   1. prendi un numero (float) in input: total
   2. prendi un numero (int) in input: nr_days
   3. crea un array con un numero di elementi pari a nr_days: days
   4. distribuisci total tra gli elementi di days in in maniera
 casuale
   di modo che la somma sia uguale a total
   esempio:
     total = 100
     nr_days = 5
     days   =   fa_la_cosa_magica()
     # days = [30, 13 , 7, 26, 24]
     check   =   0
     days.each{|d|
         check   +=   d
     }
     unless check == total
         urla_di_dolore_and_strappa_capelli
     end
     puts days.to_s
   Come fareste?
 --
 "Every normal man must be tempted at times to spit upon his hands,
 hoist the bl
 ack flag, and begin slitting throats." - H.L. Mencken

 -------------------------------------------------------------------
 -------------
 _______________________________________________
 Ml mailing list
 [3][email protected]
 [4]http://lists.ruby-it.org/mailman/listinfo/ml
_______________________________________________________________________

Ml mailing list
[5][email protected]
[6]http://lists.ruby-it.org/mailman/listinfo/ml


“Den som väntar pÃ¥ nÃ¥got gott väntar inte för länge. Den som väntar pÃ¥
någon so
m har gått får vänta länge. Den som har väntat för gott har väntat för
länge.”

References

  1. mailto:[email protected]
  2. mailto:[email protected]
  3. mailto:[email protected]
  4. http://lists.ruby-it.org/mailman/listinfo/ml
  5. mailto:[email protected]
  6. http://lists.ruby-it.org/mailman/listinfo/ml

Ummm… mi parli di pane, così all’ora di cena… Perfido!
baguette_length = 100
loaves = 10
cuts = Array.new(loaves - 1,0)

   cuts.collect! do |cut|
      rand(baguette_length) #?? ma la somma dei miei tagli supererà 

il totale!
end
cuts.sort!
puts cuts.inspect
loaf_thickness = Array.new()
cuts.each_with_index do |cut,i|
loaf_thickness << cuts[i+1] - cut unless cuts[i+1].nil?
end
puts loaf_thickness.inspect + " Sum:
#{loaf_thickness.inject(0){|sum,i| sum += i}}"
Ma non va comunque bene. Dove sbaglio? Mi perdo un pezzo alla fine mi
pare…
chiaro scuro wrote:

 On 2/26/07, david [1]<[email protected]> wrote:

    Problemino per voi:
    1. prendi un numero (float) in input: total
    2. prendi un numero (int) in input: nr_days
    3. crea un array con un numero di elementi pari a nr_days: days
    4. distribuisci total tra gli elementi di days in in maniera
 casuale
    di modo che la somma sia uguale a total
    esempio:

 devi fare un reframe del problema.
 prova a visualizzarlo così: total rappresenta la lunghezza di una
 baguette
 che devi dividere in nr_days pezzi. quindi devi distribuire
 nr_days-1 tagli
 sulla baguette per ottenere nr_days pezzi.
 ogni taglio può cadere in una posizione casuale tra zero e total.
 produci nr_total-1 tagli casualmente, sortali, e vedi quanta
 baguette c'è 
 tra due tagli contigui.. quella è la dimensione di ogni pezzo di
 baguette,
 ovvero  è il valore casuale che assegnerai a ogni giorno del tuo
 problema
 originario.
 _______________________________________________
 Ml mailing list
 [2][email protected]
 [3]http://lists.ruby-it.org/mailman/listinfo/ml


“Remember, always be yourself. Unless you suck.” - Joss Whedon

References

  1. mailto:[email protected]
  2. mailto:[email protected]
  3. http://lists.ruby-it.org/mailman/listinfo/ml

On 2/26/07, david [email protected] wrote:

Problemino per voi:

  1. prendi un numero (float) in input: total
  2. prendi un numero (int) in input: nr_days
  3. crea un array con un numero di elementi pari a nr_days: days
  4. distribuisci total tra gli elementi di days in in maniera casuale
    di modo che la somma sia uguale a total
    esempio:

devi fare un reframe del problema.

prova a visualizzarlo così: total rappresenta la lunghezza di una baguette
che devi dividere in nr_days pezzi. quindi devi distribuire nr_days-1
tagli
sulla baguette per ottenere nr_days pezzi.

ogni taglio può cadere in una posizione casuale tra zero e total.

produci nr_total-1 tagli casualmente, sortali, e vedi quanta baguette
c’è
tra due tagli contigui… quella è la dimensione di ogni pezzo di baguette,
ovvero è il valore casuale che assegnerai a ogni giorno del tuo problema
originario.

On 2/26/07, chiaro scuro [email protected] wrote:

il valore casuale dato dal taglio non rappresenta la lunghezza della fetta
che tagli, ma il punto della baguette in cui pratichi il taglio… dove 0 è
l’inizio della baguette e 1 la fine della baguette. in questo modo i tagli
sono distribuiti in modo veramente casuale e il totale è sempre uno.

mettici del fois gras e vedi che funziona :wink:

Cool Chiaro, bella soluzione.

Mi pare di ricordare che in Programming Pearls c’erano un po’ di
problemi di questo tipo che avevano a che fare con generazione di
valori random.

M

On 2/26/07, david [email protected] wrote:

Ummm… mi parli di pane, così all’ora di cena… Perfido!
baguette_length = 100
loaves = 10
cuts = Array.new(loaves - 1,0)

   cuts.collect! do |cut|
      rand(baguette_length) #?? ma la somma dei miei tagli supererà

il totale!

il valore casuale dato dal taglio non rappresenta la lunghezza della
fetta
che tagli, ma il punto della baguette in cui pratichi il taglio… dove 0
è
l’inizio della baguette e 1 la fine della baguette. in questo modo i
tagli
sono distribuiti in modo veramente casuale e il totale è sempre uno.

mettici del fois gras e vedi che funziona :wink: