public class ForeRandom { public static int random(int max) { max++; int r = (int)(Math.random() * (1 + max) * max / 2); int sum = 0; for(int i = 0; i < max; i++) { sum += max - i; if(r < sum) return i; } return -1; } public static void main(String[] args) { for(int i = 0; i < 100; i++) System.out.print("\t" + random(9)); //0 - 9共10个数,0概率最大,9概率最小,作为数组下标就可以完成要求了。 }}
yingle2000(音乐天堂) 的算法确实有效(虽然看不懂),如果没有异议的话就准备结贴了
import java.util.Random;public class Test { public static void main(String[] args) { int[] iArr = new int[100]; for (int i=0; i<100; i++) { int ii = doit(100); iArr[ii] = iArr[ii] + 1; }
{ public static int random(int max)
{
max++;
int r = (int)(Math.random() * (1 + max) * max / 2);
int sum = 0;
for(int i = 0; i < max; i++)
{
sum += max - i;
if(r < sum)
return i;
}
return -1;
} public static void main(String[] args)
{
for(int i = 0; i < 100; i++)
System.out.print("\t" + random(9)); //0 - 9共10个数,0概率最大,9概率最小,作为数组下标就可以完成要求了。
}}
{
public static void main(String[] args)
{
int[] iArr = new int[100];
for (int i=0; i<100; i++)
{
int ii = doit(100);
iArr[ii] = iArr[ii] + 1;
}
for (int i=0; i<100; i++)
{
System.out.println(i + "的次数为:" + iArr[i]);
}
}
public static int doit(int max)
{
double random = Math.random();
return (int)(Math.tan(Math.PI/4*random)*max);
}
}对于增大较小值的概率:原理就是要 形成 一条2次曲线。比如x的二次方。(斜率逐渐增大)如果要增大较大值的概率:原理就是要形成一条类似于sin的曲线。(斜率逐渐减小)
(int)(Math.sin(Math.PI/2*random)*max);yingle2000(音乐天堂) 正是利用了这个原理