Java 如何使一个随机生成的数字等于另一个?

Java 如何使一个随机生成的数字等于另一个?,java,android,random,Java,Android,Random,我有两个不同的随机数生成器:“numtofind”和“num”。第一个将1到50之间的数字放入文本视图(“textNumberToHit”),第二个将1到50之间的数字放入另十个文本视图(“textGenerateEnumber1-12”) 当游戏开始时,我希望第一个textView(“textNumberToHit”)包含在另一个textView(“textGeneratenumber”)元素中。也就是说,如果textView(“textNumberToHit”)为17,则17应出现在其他元素

我有两个不同的随机数生成器:“numtofind”和“num”。第一个将1到50之间的数字放入
文本视图(“textNumberToHit”)
,第二个将1到50之间的数字放入另十个
文本视图(“textGenerateEnumber1-12”)

当游戏开始时,我希望第一个
textView(“textNumberToHit”)
包含在另一个
textView(“textGeneratenumber”)
元素中。也就是说,如果
textView(“textNumberToHit”)
为17,则17应出现在其他元素之一中。我希望在按下“buttonGenerate”按钮时发生这种情况

虽然我可以按下按钮,但我很难找到执行上述逻辑的方法

以下是textNumberToHit的代码:

 final Random numtofind = new Random();
 final TextView textNumberToHit = (TextView) findViewById(R.id.numbertofind);
        textNumberToHit.setText(String.valueOf(numtofind.nextInt(51)));
以下是TextGenerateEnumber的代码:

final Random num = new Random();
buttongenerate.setOnTouchListener(new View.OnTouchListener() {
        public boolean onTouch(View v, MotionEvent event) {
                switch (event.getAction()) {
                    case MotionEvent.ACTION_DOWN:

                        buttongenerate.setBackgroundResource(R.drawable.pressedbut);
                        textGenerateNumber1.setText(String.valueOf(num.nextInt(51)));
                        textGenerateNumber2.setText(String.valueOf(num.nextInt(51)));
                        textGenerateNumber3.setText(String.valueOf(num.nextInt(51)));
                        textGenerateNumber4.setText(String.valueOf(num.nextInt(51)));
                        textGenerateNumber5.setText(String.valueOf(num.nextInt(51)));
                        textGenerateNumber6.setText(String.valueOf(num.nextInt(51)));
                        textGenerateNumber7.setText(String.valueOf(num.nextInt(51)));
                        textGenerateNumber8.setText(String.valueOf(num.nextInt(51)));
                        textGenerateNumber9.setText(String.valueOf(num.nextInt(51)));
                        textGenerateNumber10.setText(String.valueOf(num.nextInt(51)));
                        textGenerateNumber11.setText(String.valueOf(num.nextInt(51)));
                        textGenerateNumber12.setText(String.valueOf(num.nextInt(51)));
                        break;
                    case MotionEvent.ACTION_UP:

                        buttongenerate.setBackgroundResource(R.drawable.normalbut);
                        break;
                }
                return true;
            }
    });
下面是一张让您更好理解的图片:


我该如何做到这一点?

这样想。这里有一个(简化的)程序,基于您的要求

  • 我生成一个随机数,它是17
  • 我生成第二个随机数,它必须是17
  • 问:该程序描述中的逻辑/数学缺陷是什么?
    A:很明显,第二个数字不是随机数

    这就是你需要做的。(简化版!)

  • 生成12个不同的1随机数,并将其分配给12个按钮
  • 生成介于1和12之间的随机按钮索引
  • 获取该按钮的值,并将其分配给“要查找的编号”文本框
  • 。。。。或者类似的



    1-至少,我认为他们需要与众不同。如果你偶尔在多个按钮上看到“要找到的号码”,你的游戏看起来会很奇怪……

    这样想吧。这里有一个(简化的)程序,基于您的要求

  • 我生成一个随机数,它是17
  • 我生成第二个随机数,它必须是17
  • 问:该程序描述中的逻辑/数学缺陷是什么?
    A:很明显,第二个数字不是随机数

    这就是你需要做的。(简化版!)

  • 生成12个不同的1随机数,并将其分配给12个按钮
  • 生成介于1和12之间的随机按钮索引
  • 获取该按钮的值,并将其分配给“要查找的编号”文本框
  • 。。。。或者类似的



    1-至少,我认为他们需要与众不同。如果你偶尔在多个按钮上看到“要找到的号码”,你的游戏看起来会很奇怪……

    我建议首先使用GridView而不是12个静态文本视图:

    用你的想法回答你的问题;这就是我处理问题的方法:

    步骤:

  • 将numtofId.nextInt(51)的值保存在变量中
  • 创建另一个随机数生成器,该生成器将确定将存储值插入12个文本视图中的哪一个。然后在该文本视图中插入该值
  • 在其余文本视图中插入随机数
  • 代码:

    final Random numtofind=new Random();
    最终整数numtofind值=numtofind.nextInt(51);
    最终文本视图textNumberToHit=(文本视图)findViewById(R.id.numbertofind);
    textnumbertofit.setText(String.valueOf(numtofinvalue));
    最终随机数=新随机数();
    最终随机文本VIEWTOSET=新随机();
    //我添加1的原因是因为nextInt(int num)返回一个从0到的随机数,但不包括参数“num”的值
    // http://docs.oracle.com/javase/6/docs/api/java/util/Random.html#nextInt(国际)
    //既然你有12个文本视图,我们想得到其中一个,我们需要添加一个,这样随机数的范围将是1-12,而不是0-11。
    int textViewToSetValue=textViewToSet.nextInt(12)+1;//哪个textview设置numtofId的值
    //用文本视图填充hashmap
    Map textViews=新建HashMap();
    //这不是一种有效的方法,但由于您没有使用GridView,这是唯一的方法
    textViews.put(1,textGenerateEnumber1);
    textViews.put(2,textGenerateEnumber2);
    textViews.put(3,textGenerateEnumber3);
    textViews.put(4,textGenerateEnumber4);
    textViews.put(5,textGenerateNumber5);
    textViews.put(6,textGenerateEnumber6);
    textViews.put(7,textGenerateNumber7);
    textViews.put(8,textGenerateEnumber8);
    textViews.put(9,text9);
    textViews.put(10,textGenerateNumber10);
    textViews.put(11,textGenerateNumber11);
    textViews.put(12,textGenerateNumber12);
    TextView tvToSet=textViews.get(textViewToSetValue);//这将获得数字1-12的文本视图
    //设置textView的值
    setText(String.valueOf(numtofindValue));
    buttongenerate.setOnTouchListener(新视图.OnTouchListener(){
    公共布尔onTouch(视图v,运动事件){
    开关(event.getAction()){
    case MotionEvent.ACTION\u DOWN:
    按钮Generate.setBackgroundResource(R.drawable.pressedbut);
    //循环浏览其余的文本视图,并将其值设置为随机值
    对于(Map.Entry:textViews.entrySet(){
    //确保我们没有重置之前设置的值
    if(entry.getKey()!=textViewToSetValue){
    entry.getValue().setText(num.nextInt(51));
    }
    }
    打破
    case MotionEvent.ACTION\u UP:
    buttongenerate.setBackgroundResource(R.drawable.normalbut);
    打破
    }
    返回true;
    }
    });
    
    我建议首先使用GridView,而不是使用12个静态TextView:

    用你的想法回答你的问题;这就是我如何解决这个问题的方法:

    步骤:

  • 保存numtofId.n的值
    final Random numtofind = new Random();
    final int numtofindValue = numtofind.nextInt(51);
    final TextView textNumberToHit = (TextView) findViewById(R.id.numbertofind);
        textNumberToHit.setText(String.valueOf(numtofindValue));
    
    final Random num = new Random();
    final Random textViewToSet = new Random();
    
    // reason i am adding 1 is because nextInt(int num) returns a random number from 0 up to but not including the value of the param "num" 
    // http://docs.oracle.com/javase/6/docs/api/java/util/Random.html#nextInt(int)
    // and since you have 12 textviews and we want to get one of those we need to add one so the range of random numbers will be 1-12 instead of 0-11.
    int textViewToSetValue = textViewToSet.nextInt(12) + 1; // which textview to set the value of numtofind
    
    // populate hashmap with textviews
    Map<Integer, TextView> textViews = new HashMap<>();
    
    // not an efficient way of doing this - but since you are not using a GridView its the only way
    textViews.put(1, textGenerateNumber1);
    textViews.put(2, textGenerateNumber2);
    textViews.put(3, textGenerateNumber3);
    textViews.put(4, textGenerateNumber4);
    textViews.put(5, textGenerateNumber5);
    textViews.put(6, textGenerateNumber6);
    textViews.put(7, textGenerateNumber7);
    textViews.put(8, textGenerateNumber8);
    textViews.put(9, textGenerateNumber9);
    textViews.put(10, textGenerateNumber10);
    textViews.put(11, textGenerateNumber11);
    textViews.put(12, textGenerateNumber12);
    
    TextView tvToSet = textViews.get(textViewToSetValue); // this will get the textview for a number 1 - 12
    
    // set value of textView 
    tvToSet.setText(String.valueOf(numtofindValue));
    
    buttongenerate.setOnTouchListener(new View.OnTouchListener() {
        public boolean onTouch(View v, MotionEvent event) {
                switch (event.getAction()) {
                    case MotionEvent.ACTION_DOWN:
    
                        buttongenerate.setBackgroundResource(R.drawable.pressedbut);
                        // loop through the remaining textViews and set their values to random values
                        for (Map.Entry<Integer, TextView> entry : textViews.entrySet(){
                            // make sure we dont reset the value we set earlier
                            if(entry.getKey() != textViewToSetValue){
                                entry.getValue().setText(num.nextInt(51));
                            }
                        }
    
                        break;
                    case MotionEvent.ACTION_UP:
    
                        buttongenerate.setBackgroundResource(R.drawable.normalbut);
                        break;
                }
                return true;
            }
    });
    
     final Random numtofind = new Random();
     final TextView textNumberToHit = (TextView) findViewById(R.id.numbertofind);
     int generatedNumber = numtofind.nextInt(51);
            textNumberToHit.setText(String.valueOf(generatedNumber));
    
    ArrayList<Integer> wrongNumbers = new ArrayList<Integer>();
    int wrongNumber = 0;
    
    //I will not write the exact code. You will need to do them but the logic is correct.
    
    for(loop from 1 to 50) //you would not be looping 50 times. It is very unlikely that you won't get 12 random numbers even in 50 times (worst case)
      {
      wrongNumber = numtofind.nextInt(51);
      if(wrongNumber DOES NOT EXIST IN wrongNumbers)
       {
        wrongNumber => (PUSH TO ARRAY(wrongNumbers))
        }
    
       if(wrongNumbers.SIZE => 12) //You know have 12 numbers
           {exit from this for loop;}
    }
    
    
    //Now create the textGenerateNumbers in loop.
    
    buttongenerate.setBackgroundResource(R.drawable.pressedbut);
    for(loop from int i = 0 => 11)
    {
       textGenerateNumber[i + 1].setText(wrongNumbers[i]); //as your textGenerateNumber is from 1-12
    }
    
    //Create a random value from 0-11 to hold the correct value.
    
    int correctIndex = numtofind.nextInt(11);
    
    //Finally, override the value at the correctIndex with your number to hit.
    
    textGenerateNumber[correctIndex] = generatedNumber;