Ich habe genau diesen Code in Gawk geschrieben - Sie haben Glück. Er ist teilweise lang, weil er die Eingabereihenfolge beibehält. Es gibt wahrscheinlich Leistungsverbesserungen, die gemacht werden können.
Dieser Algorithmus ist korrekt, ohne dass die Eingabegröße im Voraus bekannt ist. Ich habe eine Rosettenstein hier darüber. (Ich habe diese Version nicht gepostet, weil sie unnötige Vergleiche anstellt).
Ursprünglicher Thread: Zur Überprüfung vorgelegt - Zufallsstichproben in awk.
# Waterman's Algorithm R for random sampling
# by way of Knuth's The Art of Computer Programming, volume 2
BEGIN {
if (!n) {
print "Usage: sample.awk -v n=[size]"
exit
}
t = n
srand()
}
NR <= n {
pool[NR] = $0
places[NR] = NR
next
}
NR > n {
t++
M = int(rand()*t) + 1
if (M <= n) {
READ_NEXT_RECORD(M)
}
}
END {
if (NR < n) {
print "sample.awk: Not enough records for sample" \
> "/dev/stderr"
exit
}
# gawk needs a numeric sort function
# since it doesn't have one, zero-pad and sort alphabetically
pad = length(NR)
for (i in pool) {
new_index = sprintf("%0" pad "d", i)
newpool[new_index] = pool[i]
}
x = asorti(newpool, ordered)
for (i = 1; i <= x; i++)
print newpool[ordered[i]]
}
function READ_NEXT_RECORD(idx) {
rec = places[idx]
delete pool[rec]
pool[NR] = $0
places[idx] = NR
}
0 Stimmen
Zu Ihrer Information: 1% von 10.000.000 ist zu viel - man braucht nur etwa 1000 für eine Fehlermarge von +/-3% und 10.000 für eine Fehlermarge von +/-1%.
0 Stimmen
@Steven: Vielen Dank für diese Informationen. Wie haben Sie die obige MOE-Zahl hergeleitet? Irgendeine Referenz? Ich möchte wirklich mehr lernen, da mein statistischer Hintergrund schwach ist. Übrigens scheint Ihre Meinung eine andere zu sein als die von Cadrian unten (d.h. 1% ist nicht genug)
1 Stimmen
americanresearchgroup.com/moe.html
0 Stimmen
@StevenHuwig Der Link scheint offline zu sein. Cache: web.archive.org/web/20131104235055/http://… Wikipedia: de.wikipedia.org/wiki/Fehlermarke