import java.util.Random;public class Test { public static void main(String[] args) { int n = 10000; int count = 0; int num = 2; for(int i = 0; i < n; i++) { int k = random(0, 9, num, 70); if(k == num) { count++; } } System.out.println(count); } /** * 指定概率随机数 * * @param start 随机数范围开始值 * @param end 随机数范围结束值 * @param num 指定概率值 * @param percent 概率 * @return * 2009-10-27 下午12:58:16 */ public static int random(int start, int end, int num, int percent) { if (start > end) { throw new IllegalArgumentException( "start must be less than or equal end"); } if (num < start || num > end) { throw new IllegalArgumentException("num must be between " + start + " and " + end); }
Random ran = new Random(); int r = ran.nextInt(100); if (r < percent) { return num; } int count = end - start + 1; int n = 0; do { n = ran.nextInt(count) + start; } while (n == num); return n; } }
改正一下参数校验: /** * 指定概率随机数 * * @param start 随机数范围开始值 * @param end 随机数范围结束值 * @param num 指定概率值 * @param percent 概率 * @return * @author Gao Baowen * 2009-10-27 下午12:58:16 */ public static int random(int start, int end, int num, int percent) { if(start < 0 || end < 0) { throw new IllegalArgumentException("start 和 end 必须为正数"); } if (start > end) { throw new IllegalArgumentException("start 不应大于 end 值"); } if (num < start || num > end) { throw new IllegalArgumentException("num 必须在 " + start + " 和 " + end + " 之间"); }
Random ran = new Random(); if (ran.nextInt(100) < percent) { return num; } int n = 0; do { n = ran.nextInt(end - start + 1) + start; } while (n == num); return n; }
刚刚写完准备发帖就看到你这句,真是英雄所见略同哈哈public class ConfigurableRandom { // 根据指定的几率生成 5000 个随机数 public static void main(String[] args) { // 数字 1-10 产生的几率分配。加起来应该等于 100 int[] possibilities = {2, 18, 5, 5, 5, 25, 10, 0, 20, 10}; // 分段 int[] splitters = new int[11]; for (int i = 0; i < possibilities.length; i++) { splitters[i + 1] = splitters[i] + possibilities[i]; } System.out.println("分段:" + Arrays.toString(splitters)); // 生成随机数并统计生成次数 int[] counter = new int[10]; Random r = new Random(); for (int i = 0; i < 5000; i++) { int d = (int) (r.nextDouble() * 100) + 1; for (int j = 0; j < splitters.length - 1; j++) { if (d > splitters[j] && d <= splitters[j + 1]) { System.out.printf("%3d", j + 1); counter[j]++; break; } } if ((i + 1) % 25 == 0) { System.out.println(); } } System.out.println("\n1~10出现次数统计:" + Arrays.toString(counter)); }}
public static void main(String[] args) throws JSONException{
int[] intArray={2,1,0,2,3,4,2,5,2,6,2,7,2,8,2,9,2,10};
for(int i=0;i<intArray.length;i++){
System.out.println(intArray[RandomInt(intArray.length)]);
}
}
public static int RandomInt(int length){
Random random=new Random();
int i=random.nextInt(length);
return i;
}
呵呵 应该是大约占30%的数(0.10>random>0.40 )
Math.random()产生一个double型的随机数,判断一下,例如0出现的概率大约为30%,则介于0到0.30中间的返回0
int n = 10000;
int count = 0;
int num = 2;
for(int i = 0; i < n; i++) {
int k = random(0, 9, num, 70);
if(k == num) {
count++;
}
}
System.out.println(count);
} /**
* 指定概率随机数
*
* @param start 随机数范围开始值
* @param end 随机数范围结束值
* @param num 指定概率值
* @param percent 概率
* @return
* 2009-10-27 下午12:58:16
*/
public static int random(int start, int end, int num, int percent) {
if (start > end) {
throw new IllegalArgumentException(
"start must be less than or equal end");
}
if (num < start || num > end) {
throw new IllegalArgumentException("num must be between " + start + " and " + end);
}
// 修正 precent 值
if (percent < 0) {
percent = 0;
}
if (percent > 100) {
percent = 100;
}
Random ran = new Random();
int r = ran.nextInt(100);
if (r < percent) {
return num;
} int count = end - start + 1;
int n = 0;
do {
n = ran.nextInt(count) + start;
} while (n == num);
return n;
}
}
* 指定概率随机数
*
* @param start 随机数范围开始值
* @param end 随机数范围结束值
* @param num 指定概率值
* @param percent 概率
* @return
* @author Gao Baowen
* 2009-10-27 下午12:58:16
*/
public static int random(int start, int end, int num, int percent) {
if(start < 0 || end < 0) {
throw new IllegalArgumentException("start 和 end 必须为正数");
}
if (start > end) {
throw new IllegalArgumentException("start 不应大于 end 值");
}
if (num < start || num > end) {
throw new IllegalArgumentException("num 必须在 " + start + " 和 " + end + " 之间");
}
// 修正 precent 值
if (percent < 0) {
percent = 0;
}
if (percent > 100) {
percent = 100;
}
Random ran = new Random();
if (ran.nextInt(100) < percent) {
return num;
} int n = 0;
do {
n = ran.nextInt(end - start + 1) + start;
} while (n == num);
return n;
}
刚刚写完准备发帖就看到你这句,真是英雄所见略同哈哈public class ConfigurableRandom { // 根据指定的几率生成 5000 个随机数
public static void main(String[] args) {
// 数字 1-10 产生的几率分配。加起来应该等于 100
int[] possibilities = {2, 18, 5, 5, 5, 25, 10, 0, 20, 10}; // 分段
int[] splitters = new int[11];
for (int i = 0; i < possibilities.length; i++) {
splitters[i + 1] = splitters[i] + possibilities[i];
}
System.out.println("分段:" + Arrays.toString(splitters)); // 生成随机数并统计生成次数
int[] counter = new int[10];
Random r = new Random();
for (int i = 0; i < 5000; i++) {
int d = (int) (r.nextDouble() * 100) + 1; for (int j = 0; j < splitters.length - 1; j++) {
if (d > splitters[j] && d <= splitters[j + 1]) {
System.out.printf("%3d", j + 1);
counter[j]++;
break;
}
} if ((i + 1) % 25 == 0) {
System.out.println();
}
} System.out.println("\n1~10出现次数统计:" + Arrays.toString(counter));
}}