Dein urspünglicher Ansatz scheint mit ok zu sein, aber langsam.
Code:
zufall = abs(lese_zufall) % K
Wie schon von himitsu bemerkt, die unteren Elemente im Array werden häufiger ausgewählt.
Ich würde nicht unbedingt nach einer passenden Zahl suchen, sondern einfach den gegebenen Wertebereich auf den gewünschten Wertebereich umrechnen.
Code:
zufall = Runden(lese_zufalls_bytes(1) / 256 * k)
ergebnis = liste[zufall]
zufall = Integer(lese_zufalls_bytes(1)) * k div 256
ergebnis = liste[zufall]
// angenommen das Byte von lese_zufalls_bytes wird automatisch vergrößert
zufall = lese_zufalls_bytes(1) * k div 256
ergebnis = liste[zufall]
Auch dieser Ansatz liefert eine ungleiche Verteilung, bestimmte Elemente werden häufiger ausgewählt als andere.
In Extremfällen wird dies deutlich:
k = (Zufallszahlendbereich + 1) -> ein bestimmtes Element wird niemals gewählt
k = (Zufallszahlendbereich - 1) -> ein bestimmtes Element wird doppelt so häufig gewählt wie die anderen
Ist der Zufallszahlenbereich allerdings hinreichend groß, kann dieses Problem vernachlässigt werden.
Ich würde den Zufallszahlenbereich dafür > (k ^ 2) wählen.