# Un insieme casuale la cui somma faccia uno?

**URL:** <https://www.ruby-forum.com/t/un-insieme-casuale-la-cui-somma-faccia-uno/86900>\
**Category:** IT\
**Created:** [February 26, 2007, 7:59pm UTC](https://www.ruby-forum.com/t/un-insieme-casuale-la-cui-somma-faccia-uno/86900 "2007-02-26T19:59:45Z")\
**Posts on this page:** 7\
**Page:** 1

<div class="post-metadata">

**Author:** ![david](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/d/aeb1de/32.png) [@david](https://www.ruby-forum.com/u/david)\
**Post date:** [February 26, 2007, 7:59pm UTC](https://www.ruby-forum.com/t/un-insieme-casuale-la-cui-somma-faccia-uno/86900/1 "2007-02-26T19:59:45Z")

</div>

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?

---

<div class="post-metadata">

**Author:** ![david](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/d/aeb1de/32.png) [@david](https://www.ruby-forum.com/u/david)\
**Post date:** [February 26, 2007, 8:14pm UTC](https://www.ruby-forum.com/t/un-insieme-casuale-la-cui-somma-faccia-uno/86900/2 "2007-02-26T20:14:48Z")

</div>

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” [removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid)  
To: “ruby-it” [removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid)  
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

* * *

---

<div class="post-metadata">

**Author:** ![david](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/d/aeb1de/32.png) [@david](https://www.ruby-forum.com/u/david)\
**Post date:** [February 26, 2007, 8:22pm UTC](https://www.ruby-forum.com/t/un-insieme-casuale-la-cui-somma-faccia-uno/86900/3 "2007-02-26T20:22:49Z")

</div>

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]<removed_email_address@domain.invalid>
 To: "ruby-it" [2]<removed_email_address@domain.invalid>
 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]removed_email_address@domain.invalid
 [4]http://lists.ruby-it.org/mailman/listinfo/ml
_______________________________________________________________________

```

* * *

Ml mailing list  
[5]removed\_email\_address@domain.invalid  
[6][http://lists.ruby-it.org/mailman/listinfo/ml](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:removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid)
2. [mailto:removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid)
3. [mailto:removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid)
4. [http://lists.ruby-it.org/mailman/listinfo/ml](http://lists.ruby-it.org/mailman/listinfo/ml)
5. [mailto:removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid)
6. [http://lists.ruby-it.org/mailman/listinfo/ml](http://lists.ruby-it.org/mailman/listinfo/ml)

---

<div class="post-metadata">

**Author:** ![david](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/d/aeb1de/32.png) [@david](https://www.ruby-forum.com/u/david)\
**Post date:** [February 26, 2007, 9:09pm UTC](https://www.ruby-forum.com/t/un-insieme-casuale-la-cui-somma-faccia-uno/86900/4 "2007-02-26T21:09:55Z")

</div>

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]<removed_email_address@domain.invalid> 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]removed_email_address@domain.invalid
 [3]http://lists.ruby-it.org/mailman/listinfo/ml

```

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

References

1. [mailto:removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid)
2. [mailto:removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid)
3. [http://lists.ruby-it.org/mailman/listinfo/ml](http://lists.ruby-it.org/mailman/listinfo/ml)

---

<div class="post-metadata">

**Author:** ![david](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/d/aeb1de/32.png) [@david](https://www.ruby-forum.com/u/david)\
**Post date:** [February 26, 2007, 8:23pm UTC](https://www.ruby-forum.com/t/un-insieme-casuale-la-cui-somma-faccia-uno/86900/5 "2007-02-26T20:23:49Z")

</div>

On 2/26/07, david [removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid) 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.

---

<div class="post-metadata">

**Author:** ![david](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/d/aeb1de/32.png) [@david](https://www.ruby-forum.com/u/david)\
**Post date:** [February 27, 2007, 9:09pm UTC](https://www.ruby-forum.com/t/un-insieme-casuale-la-cui-somma-faccia-uno/86900/6 "2007-02-27T21:09:29Z")

</div>

On 2/26/07, chiaro scuro [removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid) 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 😉

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

---

<div class="post-metadata">

**Author:** ![david](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/d/aeb1de/32.png) [@david](https://www.ruby-forum.com/u/david)\
**Post date:** [February 26, 2007, 9:15pm UTC](https://www.ruby-forum.com/t/un-insieme-casuale-la-cui-somma-faccia-uno/86900/7 "2007-02-26T21:15:56Z")

</div>

On 2/26/07, david [removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid) 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 😉
