Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/390.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 查找数组中相加为一个数的数对_Java_Arrays_Dice - Fatal编程技术网

Java 查找数组中相加为一个数的数对

Java 查找数组中相加为一个数的数对,java,arrays,dice,Java,Arrays,Dice,我正在尝试开发一个程序,该程序将搜索一个数组的内部,该数组由用户给定一个长度,以确定是否存在一对总和为7的数字。这个想法是,如果掷骰子的数量是k,那么掷骰子中的多少对数字加起来就是7。到目前为止,这是我所能想到的一切,但我被卡住了 这是程序的驱动程序类。我必须编写一个类,使这个驱动程序正常运行 import java.util.Scanner; public class SevenDriver{ public static void main(String[] args

我正在尝试开发一个程序,该程序将搜索一个数组的内部,该数组由用户给定一个长度,以确定是否存在一对总和为7的数字。这个想法是,如果掷骰子的数量是k,那么掷骰子中的多少对数字加起来就是7。到目前为止,这是我所能想到的一切,但我被卡住了

这是程序的驱动程序类。我必须编写一个类,使这个驱动程序正常运行

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;i
ArrayIndexOutOfBoundsException
表示您试图访问尚未分配的数组元素


在您的代码中,您创建了一个长度为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++;
    }
  }
}