我有一些随机比特源,希望将其转换为不同大小的整数,大致与常用骰子(1-4、1-6等)的大小相对应。
我正在编写的代码是PHP,因此最好用这种语言回答。但是,通用算法回答也完全可以。
我希望得到的答案比简单地使用我的随机数据块来种子PHP的random()函数更加复杂。
我正在编写的代码是PHP,因此最好用这种语言回答。但是,通用算法回答也完全可以。
我希望得到的答案比简单地使用我的随机数据块来种子PHP的random()函数更加复杂。
如果您有任意数量的比特可用,您可以选择使用拒绝方法,例如Java的Random.nextInt(int)
。以下是从那里获取的伪代码:
public int nextInt(int n) {
if (n<=0)
new IllegalArgumentException("n must be positive");
if ((n & -n) == n) // i.e., n is a power of 2
return (int)((n * (long)next(31)) >> 31);
int bits, val;
do {
bits = next(31);
val = bits % n;
} while(bits - val + (n-1) < 0);
return val;
}
next()
是一个函数,返回指定数量的随机位组成的 int
。您可以将其替换为您的随机位来源。
y = f(x)
且x
是随机的,则y
也必须是随机的。)然而,这并不意味着未来的值不能从过去的值中预测出来... - Oliver Charlesworth