Ich suche nach einer möglichst simplen Möglichkeit, aus einem 8-Bit Zufallswert (Normalverteilung zwischen inklusive 0 und 255) einen anderen (auch 8-Bit) Zufallswert zwischen inklusive 0 und einem (inklusiven oder exklusiven) Maximum zu errechnen.
In .NET hat man typischerweise die Random-Klasse. Die kann das natürlich schon. Bzw. wenn man es selber machen will, kann die Random-Klasse auch einen Gleitkommawert zwischen inklusive 0 und exklusive 1 generieren:
Aber ich habe keine Random-Klasse und auch keine Gleitkommazahlen.
Ich habe nur ein Byte zwischen inklusive 0 und 255.
Der Triviale Ansatz wäre, Modulo zu verwenden:
Aber im Fall, dass 256 nicht restlos durch MaxExclusive teilbar ist, haben manche Zahlen eine größere Chance (und das nennt sich Bias).
Wie hier gezeigt mit Mod 126:
Die Zahlen 0 bis 3 können durch je 3 verschiedene Zahlen errechnet werden (0 bis 3, 126 bis 129 und 252 bis 255), die übrigen Zahlen 4 bis 125 können jedoch nur durch je 2 verschiedene Zahlen errechnet werden.
Ich suche deshalb nach einer möglichst einfachen Methode, die vorzugsweise ohne Modulo-Operator und mit generell möglichst wenig Operationen.
PS:
Klarheitshalbe möchte ich erklären: Es geht nicht um VB. Ich verwende den VB-Code nur, um zu erklären, was ich meine.
In .NET hat man typischerweise die Random-Klasse. Die kann das natürlich schon. Bzw. wenn man es selber machen will, kann die Random-Klasse auch einen Gleitkommawert zwischen inklusive 0 und exklusive 1 generieren:
Aber ich habe keine Random-Klasse und auch keine Gleitkommazahlen.
Ich habe nur ein Byte zwischen inklusive 0 und 255.
Der Triviale Ansatz wäre, Modulo zu verwenden:
Aber im Fall, dass 256 nicht restlos durch MaxExclusive teilbar ist, haben manche Zahlen eine größere Chance (und das nennt sich Bias).
Wie hier gezeigt mit Mod 126:
Die Zahlen 0 bis 3 können durch je 3 verschiedene Zahlen errechnet werden (0 bis 3, 126 bis 129 und 252 bis 255), die übrigen Zahlen 4 bis 125 können jedoch nur durch je 2 verschiedene Zahlen errechnet werden.
Ich suche deshalb nach einer möglichst einfachen Methode, die vorzugsweise ohne Modulo-Operator und mit generell möglichst wenig Operationen.
PS:
Klarheitshalbe möchte ich erklären: Es geht nicht um VB. Ich verwende den VB-Code nur, um zu erklären, was ich meine.
"Luckily luh... luckily it wasn't poi-"
-- Brady in Wonderland, 23. Februar 2015, 1:56
Desktop Pinner | ApplicationSettings | OnUtils
-- Brady in Wonderland, 23. Februar 2015, 1:56
Desktop Pinner | ApplicationSettings | OnUtils