Ich muss eine Stichprobe ohne Ersatz nehmen (jedes Element kommt nur einmal in der Stichprobe vor), aus einer längeren Liste. Ich benutze den Code unten, aber jetzt würde ich gerne wissen:
Der Zweck der Probenahme besteht darin, Erkenntnisse aus der Analyse der Stichprobe für die Bevölkerung zu verallgemeinern.
%Vor%Hier ist eine schnelle Umsetzung von dem, was Daniel Fischer in seinem Kommentar vorgeschlagen hat, indem er meinen bevorzugten PRNG (mwc-random) verwendet:
%Vor% Dies ist so ziemlich eine (knappe) funktionale Neuschreibung von Rs interner C-Version von sample()
, wie es ohne Ersatz heißt.
sample
ist nur ein Wrapper für eine rekursive Worker-Funktion, die die Population inkrementell mischt, bis die gewünschte Stichprobengröße erreicht ist. Dabei werden nur die vielen gemischten Elemente zurückgegeben. Durch das Schreiben der Funktion wird sichergestellt, dass GHC sie inline einbinden kann.
Es ist einfach zu bedienen:
%Vor% Eine Produktionsversion möchte vielleicht etwas wie einen veränderbaren Vektor anstelle von Data.Sequence
verwenden, um die Zeit für GC zu verkürzen.
Ich denke, ein üblicher Weg, dies zu tun, besteht darin, einen Puffer fester Größe mit den ersten N Elementen initialisiert zu halten und für jedes i-te Element i & gt; = N dies zu tun:
Sie können die Richtigkeit durch Induktion beweisen:
Dies erzeugt eindeutig eine Stichprobe (ich nehme an, die Reihenfolge ist irrelevant), wenn Sie nur N Elemente haben. Nun nehme an, dass es bis zum i-ten Element stimmt. Dies bedeutet, dass die Wahrscheinlichkeit, dass irgendein Element im Puffer ist, N / (i + 1) ist (ich fange an, bei 0 zu zählen).
Nach der Auswahl der Zufallszahl ist die Wahrscheinlichkeit, dass das i + 1-te Element im Puffer ist, N / (i + 2) (j ist zwischen 0 und i + 1, und N davon enden im Puffer) ). Was ist mit den anderen?
%Vor%Hier ist ein Code, der es im Sample-Size-Bereich unter Verwendung des (langsamen) Standard-System.Randoms macht.
%Vor%