r****o 发帖数: 1950 | 1 明白了,
那这样行吗?
用b-a的二进制形式,比如说是12=1100,共4位。
那么运行random(0,1)4次,每次相当于二进制的一位,如果凑成的二进制数小于等于
1100,则返回randNum+b-a,否则重来。
int diffSize=0;
int diff=b-a;
while(!diff)
{
diffSize++;
diff>>=1;
}
int randNum=MAX_INT;
while(randNum>b-a)
{
randNum=0;
for (int i=0; i
{
randNum+=random(0,1)<
}
}
return randNum+b-a;
learn
learn |
|
w********p 发帖数: 948 | 2 谢谢yishan, thrust, rainbowrain 的帮忙解释。
这样可以吗? 假设rand5() 产生1,到 5, 用 rand5() 实现 rand7() 产生 1到7。
(和楼主的题,有点点不一样)
rand7() 用三个rand5(), 每个rand5()产生一个bit. 每个rand5() 遇到5的时候
drop,这样可以吗?
public int rand7() {
int randNum = 0;
int returnNum = 0;
for ( int i=0; i<3; i++) {
while ( (randNum = rand5()) == 5 ) {
}
int bit = randNum % 2;
returnNum += (bit<
}
return returnNum;
}
这个最后是产生了0-7,还是不符合需要,不过可以过滤掉不想要的0。
这个和最佳答案比,思路还是差很多。 |
|
p****r 发帖数: 9164 | 3 for(int i=0;i<52;i++)
{
int randnum = rand() % (52);
int temp=Index[i];
Index[i]=Index[randnum];
Index[randnum]=temp;
}
You think FTP 's shuffle is like this? |
|