如何在java中生成6个不同的随机数
我想使用Math.random生成6个不同的随机数,并将它们存储到一个数组中。 我如何确保它们是不同的?我知道我需要使用for循环来检查数组,但是如何 这是射程。我只需要1到49之间的数字。 (1+(int)(Math.random()*49))生成任意6个数字(不一定不同)。点吧 a1在Java 8中:如何在java中生成6个不同的随机数,java,arrays,math,random,Java,Arrays,Math,Random,我想使用Math.random生成6个不同的随机数,并将它们存储到一个数组中。 我如何确保它们是不同的?我知道我需要使用for循环来检查数组,但是如何 这是射程。我只需要1到49之间的数字。 (1+(int)(Math.random()*49))生成任意6个数字(不一定不同)。点吧 a1在Java 8中: final int[] ints = new Random().ints(1, 50).distinct().limit(6).toArray(); 在Java 7中: public sta
final int[] ints = new Random().ints(1, 50).distinct().limit(6).toArray();
在Java 7中:
public static void main(final String[] args) throws Exception {
final Random random = new Random();
final Set<Integer> intSet = new HashSet<>();
while (intSet.size() < 6) {
intSet.add(random.nextInt(49) + 1);
}
final int[] ints = new int[intSet.size()];
final Iterator<Integer> iter = intSet.iterator();
for (int i = 0; iter.hasNext(); ++i) {
ints[i] = iter.next();
}
System.out.println(Arrays.toString(ints));
}
publicstaticvoidmain(最终字符串[]args)引发异常{
最终随机数=新随机数();
final Set intSet=new HashSet();
while(intSet.size()<6){
intSet.add(random.nextInt(49)+1);
}
final int[]ints=new int[intSet.size()];
最终迭代器iter=intSet.Iterator();
for(int i=0;iter.hasNext();++i){
ints[i]=iter.next();
}
System.out.println(Arrays.toString(ints));
}
只是有点乱。将集合
解装箱为int[]
非常繁琐,这一事实对这一点没有帮助
需要注意的是,如果所需值的数量明显小于范围,则该解决方案应该是精细的。因为
1..49
比6
大得多,你很好。否则性能会迅速下降。您可以使用设置
Set<Integer> s = new HashSet<>();
while(s.size() != 6){
s.add(1 + (int) (Math.random() * 49));
}
Integer[] arr = s.toArray(new Integer[s.size()]);
Set s=newhashset();
而(s.size()!=6){
s、 加(1+(int)(Math.random()*49));
}
整数[]arr=s.toArray(新整数[s.size()]);
在您的例子中,这就足够了,因为与生成它们的范围大小相比,不同随机数的数量相对较小
否则我将采用@JBNizet方法。创建一个包含数字1到49的列表
创建一个介于0和列表大小之间的随机数x
,获取列表中索引x
处的数字,然后将其从列表中删除
重复上一步5次。你完成了。请注意,java.util.Random
有一个nextInt(int max)
方法,您应该使用它来代替Math.Random()
关于性能的注意事项:与“尝试获得6个不同的数字”不同的解决方案相比,此解决方案有一个优势:它在O(n)时间内运行。50个数字中有6个是唯一的并不重要,但是如果你想从50个数字中得到48个或49个唯一的随机数,你会看到不同,因为在得到一个不在集合中的随机数之前,你可能需要生成许多随机数
编辑:
为了减少删除列表中的元素所带来的成本,您只需将索引x
处的元素替换为列表的最后一个元素(在第二次迭代时,使用大小为-2的元素,等等)。只需不断生成数字并将其添加到数组中,只要它们是唯一的;伪代码:
num = genNextRand()
For (array length)
If (num not in array)
addToArray()
Repeat while length not equal 6
不必检查数组是否没有重复项,您可以在生成数字时使用更智能的方法,这样就可以在一开始就强制执行唯一性
创建一个boolean[]
,长度与您的范围相同(49个条目)李>
从整个范围生成一个随机数李>
将该数字放入输出数组李>
在布尔值[]
中“划掉”相应的索引李>
现在生成另一个随机数,但将范围缩小一(现在为48)李>
不要直接使用该数字作为输出,而是扫描布尔[]
,计算所有未交叉的条目。当达到等于步骤5中生成的随机数的计数时停止。与该条目对应的编号是您的输出编号李>
转至步骤4
最后创建一个变量;将其初始化为0
接下来,在从0到5的循环x中,在last+1
和49-6+x
之间创建一个随机数。将此号码存储在列表中,并将last
设置为以这种方式生成的号码
您将得到一个由6个随机数组成的有序列表,范围为1..49,没有重复。在您的情况下,n=6
public static int[] chooseAny(int n){
int[] lottery = new int[n];
int[] chooseFrom = new int[49];
for(int i=1 ; i <= 49 ; i++)
chooseFrom[i-1] = i;
Random rand = new Random();
int N = 49;
int index;
for(int i=0 ; i < n ; i++){
//pick random index
index = rand.nextInt(N);
lottery[i] = chooseFrom[index];
chooseFrom[index] = chooseFrom[N-1];
N--;
}
return lottery;
}
公共静态int[]选择任意(int n){
int[]彩票=新的int[n];
int[]chooseFrom=新int[49];
对于(inti=1;i我刚刚想到了一个Java8-的小主意
Set<Integer> set = new LinkedHashSet<>();
while(set.size() != 6)
set.add(rnd.nextInt(49) + 1);
Set Set=newlinkedhashset();
while(set.size()!=6)
集合。添加(rnd.nextInt(49)+1);
该代码生成从6到0的数字并保存在ArrayList中
如果生成的编号重复,程序将再次生成编号
如果生成的编号不同,则添加该编号
代码:
private ArrayList ArrayList=new ArrayList();
private Random rand=new Random();
public void insertNumber(){
while(true){
int i=generateNumber();
如果(!isGenerateEnumberExists(i)){
地址编号(i);
打破
}
}
}
//生成数字
私有整数生成器枚举器(){
返回兰特。耐克斯汀(6);
}
//确认该号码是否存在
私有布尔IsGenerateEnumberExists(int y){
for(int num:arraylist){
如果(num==y){
返回true;
}
}
返回false;
}
//将数字添加到arrayList
专用void addNumber(int x){
arraylist.add(x);
}
只需不断生成数字并将其添加到数组中,只要它们是唯一的;生成一个数字并对照数组中的其他数字进行检查。与手动操作完全相同。掷骰子获得一个数字,检查它是否是您尚未拥有的数字,记录它,重复,直到您拥有所需的数字为止。-Or实现自己的shuffle,这是一个更通用的解决方案。这与OP的要求无关,但仍然…我忍不住对这种具有糟糕性能特征的可爱的单行程序感到失望。我在Clojure中看到了我的这一部分。我同意@MarkoTopolnik。虽然这是一个很好的单行程序,但JBNizet的解决方案有很多
Set<Integer> set = new LinkedHashSet<>();
while(set.size() != 6)
set.add(rnd.nextInt(49) + 1);
private ArrayList<Integer> arraylist = new ArrayList<Integer>();
private Random rand = new Random();
public void insertNumber() {
while (true) {
int i = generateNumber();
if(!isGenerateNumberExists(i)){
addNumber(i);
break;
}
}
}
//Generate numbers
private int generateNumber() {
return rand.nextInt(6);
}
//Confirm if that number exists
private boolean isGenerateNumberExists(int y) {
for (int num : arraylist) {
if (num == y) {
return true;
}
}
return false;
}
//Add number to arrayList
private void addNumber(int x) {
arraylist.add(x);
}