un circo, praticamente.
l'algoritmo di suoranciata e dell'altro non autenticato nel thread originale e` corretto.
Se hai una funzione rand() che estrae un numero casuale tra 0 e 1 con distribuzione uniforme, la probabilita` di un sottointervallo di ampiezza A e` A.
Resta da dimostrare che l'algoritmo associa (in un modo qualsiasi) ad ogni elemento di probabilita` A un intervallo di ampiezza A cosa che e` banale da dimostrare (o da implementare).
Il problema con il fatto che i numeri floating point sono spesso inesatti ce l'hai e non lo puoi evitare mai completamente, i numeri in R sono ovviamente offlimits, puoi ottenere una migliore rappresentazione dei numeri in Q se usi le frequenze, in quel caso rappresenti in modo esatto qualunque distribuzione il cui minimo comun denominatore e` minore del massimo numero che puoi rappresentare (che se usi un implementazione di bignums e` limitato dalla dimensione della memoria).
Con le frequenze l'algoritmo e`:
a = [ 2, 1, 1, 0 ]
def gs_intervalli(a):
n = sum(a)
x = random.randrange(n)
acc = 0
for i in range(len(a)):
acc += a[i]
if (acc > x): return i
return -1
la cosa bella e` che questa roba si puo` riscrivere in modo che faccia una sola passata su a, senza dover conoscere sum(a) in anticipo.