Problema: numeri a caso

Tempo di quiz! Ecco un problemino per chi vuole cimentarsi nel week-end (la soluzione la darò lunedì sera).

Voglio un metodo per generare 3 numeri (non negativi) a caso in maniera che la loro somma sia 1. Attenzione: voglio una distribuzione uniforme delle triplette: non ci deve essere una tripletta più probabile di un altra. Sapete fornirmi un metodo? E sapreste generalizzarlo a N numeri?

Mettete pure le vostre soluzioni nei commenti!

Posta un commento o usa questo indirizzo per il trackback.

Commenti

  • hronir  Il 11 Maggio 2012 alle 10:36

    Senza pensarci troppo (non so se è garantita l’uniformità delle triplette… ma poi cosa significa “uniformità di una tripletta”? In base a che metrica? Punti uniformi nel cubo di lato 1?): genero due numeri random con distribuzione piatta fra 0 e 1, li ordino e chiamo x1 il più piccolo dei due e x2 il più grande. I tre numeri richiesti sono le ampiezze degli intervalli (0,x1), (x1,x2), (x2,1).

    • glipari  Il 11 Maggio 2012 alle 11:25

      Cerco di essere più preciso possibile dandoti un’interpretazione geometrica. I tre numeri sarebbero le coordinate di un punto in R^3, e verranno tutte all’interno del triangolo in 2D con vertici (1,0,0), (0,1,0) e (0,0,1). I numeri devono essere sparsi in maniera uniforme sul triangolo: se ne tiro a caso un milione e li disegno sul triangolo, non devono accumularsi più frequentemente in una zona (per esempio al centro).

      Non ti dico se la tua soluzione è giusta, per ora. Lo scoprirai lunedì!

      • hronir  Il 11 Maggio 2012 alle 11:42

        Il cubo di lato 1?!?
        Che stupido!

      • hronir  Il 11 Maggio 2012 alle 13:07

        Non mi è ovvio dimostrare l’uniformità dei numeri sul triangolo generati col mio metodo…
        Di contro, partendo direttamente dal triangolo (equilatero, di lato sqrt(2)), saprei come generare numeri uniformemente al suo interno partendo da considerazioni geometriche, ma il metodo che mi viene in mente è molto complicato:

        prendo il triangolo equilatero e lo raddoppio in un rombo di diagonale minore e lati tutti pari a sqrt(2), poi applico una trasformazione affine per trasformarlo in un quadrato e genero punti uniformemente dentro il quadrato (una trasformazione affine preserva la “uniformità delle aree”, vero? trasformando anche le aree, ovviamente…); poi scarto i punti che stanno al di là di una diagonale del quadrato e infine, a partire dai punti che accetto, inverto la trasformazione affine per ricavare, a partire dalle due coordinate del punto del quadrato al di qua della diagonale, le tre coordinate nello spazio che, per costruzione, devono sommare ad uno.

        Con questo metodo complicatissimo riesco a garantire l’uniformità nel triangolo; per il primo metodo che ho proposto dovrei pensare ad una dimostrazione sulla uniformità (o meno, e in questo caso scartarlo come possibile soluzione al tuo quesito).
        Ci penso ancora e al più tardi torno qui lunedì.

      • glipari  Il 11 Maggio 2012 alle 15:07

        In effetti è complicato! In realtà, scartare per scartare, potresti anche evitare la trasformazione affine (che è solo per ottimizzare l’area).

        Va bene, ci risentiamo più avanti!

    • piergiu  Il 11 Maggio 2012 alle 12:23

      bel metodo, estraendo x1 e x2 con distribuzione uniforme sembra il metodo più semplice!

  • Piero Giacomelli (@pierogiacomelli)  Il 11 Maggio 2012 alle 11:27

    uso le api del sito random.org (non gli algoritmi pseudocausali ) mi faccio dare N numeri li sommo tutti e rinormalizzo la somma a 1. Poi rinormalizzo anche gli originali. un esempio usando l’interfaccia web usando come intervallo iniziale 1-100 ottengo 98, 81 , 13 da cui 98+81+13 = 192 usando 98:192 = x : 1 ottengo la tripletta 0.510416 + 0.421785 + 0.0677083

    • piergiu  Il 11 Maggio 2012 alle 12:21

      interessante anche questo modo, ma non si perderebbero(verrebbero esclusi) i vertici stessi del triangolo 2d in R^3? quindi l’intervallo io lo metterei da 0 a 100, e poi come prima, dividere ogni numero estratto per la somma di tutti i numeri estratti con distribuzione uniforme

      • piergiu  Il 11 Maggio 2012 alle 12:38

        vertici e anche spigoli inclusi usando lo 0 come inizio dell’intervallo

    • glipari  Il 11 Maggio 2012 alle 15:10

      Mi dispiace, ma purtroppo il metodo della rinormalizzazione non funziona. I punti “nel mezzo” del triangolo hanno probabilità più alta di saltar fuori rispetto ai punti che stanno ai bordi. Provare per credere!

  • juhan  Il 11 Maggio 2012 alle 19:56

    Naturalmente prendere 3 numeri random al volo non vale, troppo semplice. Ma è quello che farei io.
    (scrivo questo commento anche per vedere se sono riuscito a riabilitare l’RSS)

    • glipari  Il 13 Maggio 2012 alle 19:39

      Il problema è che la somma dei tre numeri deve essere 1: ad esempio [0.3, .0.5, 0.2] vanno bene, mentre [0.1, 0.2, 0.3] non vanno bene.

      Funziona l’RSS?

      • juhan  Il 13 Maggio 2012 alle 20:36

        L’RSS funziona ma ci mette tantissimo; meglio controllare periodicamente.
        Sì, ho dato per scontato che avrei diviso ogni numero per la somma dei tre.

Lascia un commento

Questo sito utilizza Akismet per ridurre lo spam. Scopri come vengono elaborati i dati derivati dai commenti.