Come posso creare un insieme di numeri casuali in base al numero totale e al numero di oggetti?

1

Ad esempio con:
Popolazione totale = 400000
Numero di villaggi = 800
La popolazione media è di 500

Come posso randomizzare la quantità di persone in ogni villaggio usando una deviazione specificata (ad esempio + -50) in modo che sia uguale alla popolazione totale?

Ho trovato una soluzione utilizzando questa normale classe di distribuzione
Fondamentalmente ho creato una distribuzione normale e ho usato la funzione Probability Density per determinare la quantità di villaggi a ciascun livello discreto (fino a quando il totale della popolazione è stato colpito).

Questo è qualcosa che ho scritto rapidamente per dimostrare:

 NormalDist dist = new NormalDist(500.0, 50.0);
 int popX = 500;
 int numberOfPopXVillages = Convert.ToInt32(Math.Floor(dist.PDF(popX) * 800)); ;
 int totalSum = 0;
 do
 {
     Console.WriteLine(numberOfPopXVillages);
     totalSum += popX * numberOfPopXVillages;
     totalSum += (1000 - popX) * numberOfPopXVillages;
     ++popX;
     numberOfPopXVillages = Convert.ToInt32(Math.Floor(dist.PDF(popX) * 800));
 } while (numberOfPopXVillages >= 5);
 Console.WriteLine(totalSum);

La somma totale qui è 400000. L'algoritmo non è perfetto ma continuerò a lavorarci su. Grazie a tutti.

    
posta user126795 13.04.2014 - 10:25
fonte

1 risposta

2

Per prima cosa, usi Distribuzione normale per generare popolazione di ogni villaggio. Questo dovrebbe darti un numero abbastanza vicino alla popolazione totale. Per ottenere una popolazione esatta, aggiungi o rimuovi la differenza in modo uniforme in tutti i villaggi.

Il problema di questo algoritmo è che esiste una certa probabilità di generare una popolazione negativa. Ma questo dipende molto dai parametri. Per i parametri del tuo esempio, la probabilità è estremamente ridotta. Ma per i parametri (10000, 100, 50), la probabilità è lì.

import random

def generate_villages(total, count, deviation):
    average = total / count
    villages = [random.gauss(average, deviation) for _ in range(count)]
    diff = (sum(villages) - total)/count
    villages = [round(v - diff) for v in villages]
    return villages

vil = generate_villages(400000, 800, 50)
print(vil)
print(sum(vil))

Sebbene questo codice non dia un numero preciso. Devia + -10 che va bene.

    
risposta data 13.04.2014 - 10:49
fonte

Leggi altre domande sui tag