Java 查找数组中相加为一个数的数对
我正在尝试开发一个程序,该程序将搜索一个数组的内部,该数组由用户给定一个长度,以确定是否存在一对总和为7的数字。这个想法是,如果掷骰子的数量是k,那么掷骰子中的多少对数字加起来就是7。到目前为止,这是我所能想到的一切,但我被卡住了 这是程序的驱动程序类。我必须编写一个类,使这个驱动程序正常运行Java 查找数组中相加为一个数的数对,java,arrays,dice,Java,Arrays,Dice,我正在尝试开发一个程序,该程序将搜索一个数组的内部,该数组由用户给定一个长度,以确定是否存在一对总和为7的数字。这个想法是,如果掷骰子的数量是k,那么掷骰子中的多少对数字加起来就是7。到目前为止,这是我所能想到的一切,但我被卡住了 这是程序的驱动程序类。我必须编写一个类,使这个驱动程序正常运行 import java.util.Scanner; public class SevenDriver{ public static void main(String[] args
import java.util.Scanner;
public class SevenDriver{
public static void main(String[] args){
System.out.println("Enter number of dice to toss");
Scanner s = new Scanner(System.in);
int diceCount = s.nextInt();
SevenTally t = new SevenTally(diceCount);
int experiments = 1000000;
int wins = 0;
for(int j = 0; j < experiments; j++)
if(t.experiment()) wins++;
System.out.println((double)wins/experiments);
}
}
import java.util.Scanner;
公共类SevenDriver{
公共静态void main(字符串[]args){
System.out.println(“输入要掷骰子的数量”);
扫描仪s=新的扫描仪(System.in);
int diceCount=s.nextInt();
七分t=新七分(骰子计数);
int=1000000;
int=0;
对于(int j=0;j<实验;j++)
如果(t.experience())赢了++;
System.out.println((双)赢/实验);
}
}
这就是我目前所拥有的。它目前无法工作或编译。我只是想找一些想法让我走。谢谢
public class SevenTally{
private int diceCount;
public SevenTally(int die){
diceCount = die;
}
public int genDice(){
return 1 + (int)(Math.random()*6);
}
public boolean experiment(){
boolean[] nums = new boolean[diceCount];
int ranNum;
int sum = 7;
for(int i = 0; i < nums.length; i++){
ranNum = genDice();
if (nums[ranNum] == sum){
return true;
}
}
int left = 0;
int right = nums.length - 1;
while(left<right){
int tempSum = nums[left] + nums[right];
if(tempSum == 7){
return true;
}
else if(tempSum>7){
right--;
}
return false;
}
}
public类七次{
私人整数计数;
公共七分之一(整数){
骰子计数=骰子;
}
公共关系{
返回1+(int)(Math.random()*6);
}
公共布尔实验(){
布尔值[]nums=新布尔值[diceCount];
int ranNum;
整数和=7;
对于(int i=0;i
在ranNum中生成一个随机数,然后将其用作数组nums的索引。同时,nums永远不会被填充,所以无论您索引到哪个框中,它都不会包含7
如果我正确理解了你的问题,你想做的是用骰子掷骰的结果填充数组中的每个空格,然后比较每两个位置(掷骰),看看它们的总和是否为7。可以使用嵌套的for循环来实现这一点
本质上,您希望这样做:(由于我不是java程序员,所以使用伪代码编写)
然而,在这种情况下,还有一种更简单的方法。你知道在2d6上求和7的唯一方法是(1,6),(2,5),(3,4),(4,3),(5,2),(6,1)。设置一个6长度的布尔数组,掷骰子,每次掷骰后将res[result]设置为true。然后返回(为简单起见使用的基于1的数组)((res[1]&&res[6])| |(res[2]&&res[5])| |(res[3]&&res[4])。本页有一些算法可以实现这一点。这不是一个小问题…首先在[1;6]中用随机整数填充长度为k的
数组
长度为k的数组中可能的对数是数组中2个组合的数目,即(k-1)*k/2()
您可以测试数组中所有可能的对(i,j),如下所示:
int win = 0;
int tally = 7;
for(int i=0; i<k-1; i++){
for(int j=i+1; j<k; j++){
if(array[i]+array[j] == tally){
win++;
}
}
}
int-win=0;
整数=7;
for(int i=0;iArrayIndexOutOfBoundsException
表示您试图访问尚未分配的数组元素
在您的代码中,您创建了一个长度为diceCount的新数组d
,但之后您总是在6个元素上使用genDice()。我试图解决的问题是,为了让驱动程序正常工作,请尝试()必须返回一个布尔值,我不太确定如何获取该值,因为当我使用genDice生成随机值时,它会给我一个错误,不允许将int与布尔值放在一起。NUM数组应该是int[],而不是boolean[]。另一方面,如果您想知道有多少种不同的方法可以在给定的行上得到7(并且允许一个骰子成为多个组合的一部分),那么使用一个初始化为0的整数数组,将一个整数添加到相应的框中,而不是将其设置为true。那么您的和将是(min(res[1],res[6)+min(res[2],res[5])+min(res 3),res[4])。知道这个算法实际上有一个名称和很多信息非常有帮助。谢谢!虽然这个问题与子集_SUM有相似之处,但两个骰子的和是否等于七的问题实际上是有限的,以至于它可以在线性时间内得到回答。(背包,当然,是NP完全的)我没有完全阅读它,但如果是这样的话,那么这是一个很好的澄清。那么我该如何为数组中的每个骰子生成一个新的随机数1-6呢?我完全被难住了。这可能很明显,但我是一个空白。对不起,我是java编程新手。@user3443348如果有机会,向Jessica问好;)
int win = 0;
int tally = 7;
for(int i=0; i<k-1; i++){
for(int j=i+1; j<k; j++){
if(array[i]+array[j] == tally){
win++;
}
}
}