问题分析,由于上一次java随机数带概率版时需要算出其总概率为100%,所以很不方便。我就想着能不能弄一个不带比例,带权重的随机数,这样的优点就是不需要满足概率总和为100%,反正你权重越大,出现比例约高就Ok了。
做了如下优化:1.完全靠输入数据,包括权重
2.不仅可以实现与数字的随机生成,还可以随机生成字符串。
输入情况:第一行输入出现的随机数总个数N(有哪些数据会生成,比如随机生成1-100的整数。那么总个数就是100,且会出现的数据是1、2、3、4……100)
以下N行包括会出现的数(如上1、2、3、4……100)以及他的权重(整数)
代码如下:
package suijishu;
import java.io.IOException;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import java.util.Random;
import java.util.Scanner;
public class main {
public static void main(String[] args)throws IOException
{
// TODO Auto-generated method stub
Scanner sc = new Scanner(System.in);
int N = sc.nextInt();
//生成两个数组,第一个保存需要的随机数,第二个保存其权重。两个数组一一对应。
int [] key = new int[N];
int [] weigh = new int[N];
//遍历带入数据
for(int i = 0;i < N;i++)
{
key[i] = sc.nextInt();
weigh[i] = sc.nextInt();
if(i != 0)
weigh[i] += weigh[i-1]; //对应的是当前权重与之前权重之和。
}
int weighs = weigh[N-1];//总权重
//生成随机数
Random random = new Random();
//确定随机数范围[0,weighs),并且生成随机数保存于result
int result = random.nextInt(weighs);
//遍历:不难看出数组weigh的值是在慢慢变大的
for(int i = 0;i < N;i++)
{
if(result < weigh[i])
{
System.out.println(key[i]);
break;
}
}
}
}
开始想过用HashMap来实现储存,不过失败了。换了最简单的数组。
有段代码可能有点难以理解:
//遍历:不难看出数组weigh的值是在慢慢变大的
for(int i = 0;i < N;i++)
{
if(result < weigh[i])
{
System.out.println(key[i]);
break;
}
}
举个例子来吧,随机出现的数字有 1 2 3 4 5,权重为 1 2 3 4 5.通过代码发现,我们的数组key存储的是1,2,3,4,5.
而数组weigh则变为了1,3,6,10,15,可以理解为随机生成15个数,出现随机数1的结果记1,出现随机数2-3的结果记2,出现随机数4-6的记3,依次。由于weigh数组数据是递增的,因此只需要看他满足小于哪个范围,在break掉就OK了。
全是数字的不好理解,下面我把随机出现的数字换成字符串
将int [] key = new int[N];
改为String [] key = new String[N];
以及key[i] = sc.nextInt();改为:key[i] = sc.nextInt();就OK了;
运行一下:
这样子就可以做一个带权重的随机生成器了。
你们可以加一个循环多实现几次验证一下。