给定一个产生真随机32位数的函数R,我想要一个返回0到n范围内随机整数的函数,其中n是任意的(小于2 ^ 32).
该函数必须以相同的概率产生0到n的所有值.
我想要一个在没有if语句或循环的情况下在常量时间内执行的函数,所以像Java Random.nextInt(n)函数这样的东西就出来了.
我怀疑一个简单的模数不会起作用,除非n是2的幂 - 我是对的吗?
我接受了Jason的答案,尽管它需要一个不确定持续时间的循环,因为它似乎是在实践中使用的最佳方法,并且基本上回答了我的问题.然而,我仍然对任何算法(即使效率较低)感兴趣,这些算法本质上是确定性的并且保证终止,例如Mark Byers指出的.
许多随机数生成器返回0到1之间的浮点数.
在a和b之间获得整数的最佳和正确方法是什么?
有人问我产生之间的随机数a和b,包容,使用random(0,1).random(0,1)生成0到1之间的均匀随机数.
我回答了
(a+(((1+random(0,1))*b))%(b-a))
Run Code Online (Sandbox Code Playgroud)
我的采访者对我b在这段表达中的用法不满意:
(((1+random(0,1))*b))
Run Code Online (Sandbox Code Playgroud)
然后我尝试将我的答案改为:
int*z=(int*)malloc(sizeof(int));
(a+(((1+random(0,1))*(*z)))%(b-a));
Run Code Online (Sandbox Code Playgroud)
后来这个问题改变产生random(1,7)的random(1,5).我回答:
A = rand(1,5)%3
B = (rand(1,5)+1)%3
C = (rand(1,5)+2)%3
rand(1,7) = rand(1,5)+ (A+B+C)%3
Run Code Online (Sandbox Code Playgroud)
我的答案是否正确?
我想写一个算法来生成1-7之间的随机数,给出一个生成1-5之间随机数的方法.
我想到了一个解决方案rand(5)/ 5*7 ??
我认为这应该有效.
谁能告诉我一个最佳解决方案?
我在某处读到了这个解决方案,但我不知道他们怎么想保持"int num = 5*(rand5() - 1)+(rand5() - 1);" .我知道它会在1-7之间生成一个随机数,但是他们如何看待这种逻辑或者他们想要表达的内容并没有进入我的脑海.任何人都可以对此有所了解.
public static int rand7() {
while (true) {
int num = 5 * (rand5() - 1) + (rand5() - 1);
if (num < 21)
return (num % 7 + 1);
}
}
Run Code Online (Sandbox Code Playgroud) 所以这是一个面试问题。
提供了一个函数rand5(),该函数生成范围为[0-5]的随机整数,即{0,1,2,3,4,5}
a)您可以使用该函数生成范围为[0-7]的随机整数吗?
b)您可以使用该函数生成范围为[0-7]的随机整数,每个数字具有相等的概率吗?
您可以多次使用该功能。
a部分的解决方案之一,((rand5() +rand5())*7)//10其中// represents integer division的范围为[0-7],但是概率不相等。
希望看到您的答案和思考过程。
使用一对六面骰子以[1,4]不均匀生成随机数的最有效方法是:它应该在40%的时间内产生1,在30%中产生2,在20%中产生3,以及4在10%.
请证明方法的正确性并给出算法.
骰子可以是不同的颜色.
注意:唯一可用的随机数发生器是两个不同颜色的六面骰子.
假设我们有一个随机生成器函数rand5,它生成1到5之间的随机数,包括1和5.我已经看到,如果你想使用它来生成1到7之间的随机数,包括在内,你应该重复计算
(5 * (rand5() - 1) + rand5())
Run Code Online (Sandbox Code Playgroud)
生成1到30之间的随机数(包括1和30),并重复此过程,直到生成1到21之间的数字,然后取结果模7.
为什么不直接使用这个公式计算1到7之间的随机数(包括1和7)?
(rand5() + rand5() + rand5()) % 7 + 1
Run Code Online (Sandbox Code Playgroud)