我正在编写一个程序,模拟1到45之间六个数字的乐透画,样本输出是3 7 12 27 43 28.但我想要做的是计算相邻数字出现的次数,例如1 4 5 29 26 41是一个肯定的答案,因为5是在4之后。
这样做的最佳方式是什么?
我尝试了以下示例:
int adjacent=0;
for(int i =0; i<6; i++)
{
int t = test[i]+1;
test[i]=(int)(45*Math.random())+1;
if(test[i]==t)
adjacent++;
System.out.print(test[i]+" ");
}
这不起作用。
我做错了什么?
答案 0 :(得分:0)
我认为你应该洗牌并拿走任何五个。 Collections#Shuffle
可以帮助您,它使用默认的随机源来置换指定的列表。所有排列都以大致相等的可能性发生。
List<Integer> list = ArrayList<Integer>();
list.add(1);
list.add(2);
Collections.shuffle(list);
Random rnd = new Random();
Integer[] result = new Integer[5];
result[0] = list.get(rnd.getNextInt(45));
result[1] = list.get(rnd.getNextInt(45));
result[2] = list.get(rnd.getNextInt(45));
result[3] = list.get(rnd.getNextInt(45));
result[4] = list.get(rnd.getNextInt(45));
它总是为您提供随机值,然后您应该对其进行排序以按顺序排列,比如提升。
Arrays.sort(result);
现在你可以写一个循环找出相邻的数字。
int adjacent = 0;
for(int i=1; i<result.length;i++){
int prev = result[i-1];
int now = result[i];
if(prev+1 == now)
adjacent++;
}
答案 1 :(得分:0)
生成6个数字并将它们放入数组后。使用Arrays.sort()
。然后,您可以比较相邻的数组条目。
您还应该避免使用Random来生成6个数字,因为它可以生成重复数据。这可能会也可能不会准确地模拟您的乐透画。 Quoi的回答对此有很好的建议。
答案 2 :(得分:0)
我认为你只是有一个操作顺序问题
int adjacent=0;
for(int i =0; i<6; i++)
{
//test[i] hasn't been set yet
int t = test[i]+1;
test[i]=(int)(45*Math.random())+1;
//this comparison doesn't make a whole lot of sense
if(test[i]==t)
adjacent++;
System.out.print(test[i]+" ");
}
将其更改为以下内容:
int adjacent=0;
for(int i =0; i<6; i++)
{
test[i]=(int)(45*Math.random())+1;
int t = -1;
//Make sure this comparison only happens after the second iteration
//to avoid index out of bounds
if ( i != 0 )
{
//Set t to the last number + 1 instead of trying to predict the future
t = test[i-1] + 1;
}
//Now this comparison makes a little more sense
//The first iteration will compare to -1 which will always be false
if(test[i]==t)
adjacent++;
System.out.print(test[i]+" ");
}
这可以进一步简化为:
int adjacent=0;
for(int i =0; i<6; i++)
{
test[i]=(int)(45*Math.random())+1;
if(i != 0 && test[i]==(test[i-1]+1))
adjacent++;
System.out.print(test[i]+" ");
}
答案 3 :(得分:0)
您需要将独特的生成(因此下面的HashSet)与随机选择分开,对它们进行排序,然后确定邻接:
import java.util.HashSet;
import java.util.Arrays;
public class Lotto
{
public Lotto()
{
}
/**
* @param args
*/
public static void main(String[] args)
{
Lotto lotto = new Lotto();
lotto.randomizeSelections(5);
}
private void randomizeSelections(int numOfArrays)
{
for(int i = 0; i < numOfArrays; i++)
{
int[] selArry = new int[6];
//to insure that each random selection is unique
HashSet<Integer> idntySet = new HashSet<Integer>();
for(int j = 0; j < 6;)
{
int rndm = (int)(45 * Math.random()) + 1;
//add selection to the array only if it has not been randomized before
if(!idntySet.contains(rndm))
{
selArry[j] = rndm;
j++;
}
}
//sort the array for determing adjacency
Arrays.sort(selArry);
for(int j = 0; j < 6; j++)
{
int sel = selArry[j];
boolean isAdjcnt = (j > 0 && (sel == selArry[j - 1] + 1)) ? true : false;
System.out.println(i + "." + j + ".random = " + sel);
if(isAdjcnt) System.out.println("\tAdjacent");
}
}
}
}