1、rand5()到rand7()
class Rand5To7
{
public int rand5()
{
return (int) (Math.random() * 5) - 1;
}
public int rand5To7()
{
int num = 0;
do{
num = (rand5() - 1) * 5 + rand5() - 1;
}while(num > 20);
return num % 7 + 1;
}
}
2、给定一个以p概率产生0,以1-p概率产生1的随机函数rand01p()
class Rand6
{
public int rand01p()
{
double p = 0.80;
return Math.random() < p ? 0 : 1;
}
public int rand01()
{
int num;
do{
num = rand01p();
}while(num == rand01p());
return num;
}
public int rand3()
{
return rand01() * 2 + rand01();
}
public int rand6()
{
int num = 0;
do{
num = rand3() * 4 + rand3();
}while(num > 11);
return num % 6 + 1;
}
}
3、randM()到randN()
class randMToN
{
public int randM(int m)
{
return (int) (Math.random() * m) + 1;
}
public int randMToN(int m, int n)
{
int []nMNum = getnMNum(n-1, m);
int []randMNum = getRandMNumLessN(nMNum, m);
int res = getNumFromMNum(randMNum, m);
return res;
}
public int[] getnMNum(int value, int m)
{
int []res = new int[32];
int index = res.length - 1;
while(value != 0)
{
res[index--] = value % m;
value = value / m;
}
return res;
}
public int[] getRandMNumLessN(int []nMNum, int m)
{
int []res = new int[nMNum.length];
int start = 0;
while(nMNum[start] == 0) start++;
int index = start;
boolean lastEqual = true;
while(index != nMNum.length)
{
res[index] = randM(m) - 1;
if(lastEqual)
{
if(res[index] > nMNum[index])
{
index = start;
lastEqual = true;
continue;
}
else
{
lastEqual = res[index] == nMNum[index];
}
}
index++;
}
return res;
}
public int getNumFromMNum(int []MNum, int m)
{
int res = 0;
for(int i=0; i!=MNum.length; i++)
{
res = res * m + MNum[i];
}
return res;
}
}