简体   繁体   English

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

[英]How do I make one random generated number equal to another?

I have two different random number generators: "numtofind" and "num". 我有两个不同的随机数生成器:“ numtofind”和“ num”。 The first one puts a number from 1 to 50 into a textView("textNumberToHit") and the second one puts a number from 1 to 50 to another ten textViews("textGeneratenumber1-12") . 第一个将1到50的数字放入textView("textNumberToHit") ,第二个将1到50的数字放入另外十个textViews("textGeneratenumber1-12")

When the game starts, I want the first textView("textNumberToHit") to be contained in one of the other textView("textGeneratenumber") elements. 游戏开始时,我希望第一个textView("textNumberToHit")包含在其他textView("textGeneratenumber")元素之一中。 That is, if textView("textNumberToHit") is 17, 17 should appear in one of the other elements. 也就是说,如果textView("textNumberToHit")为17,则17应该出现在其他元素之一中。 I want that to happen when a "buttonGenerate" button is pressed. 我希望在按下“ buttonGenerate”按钮时发生这种情况。

While I can press the button, I am having trouble finding a way of doing the above logic. 虽然可以按按钮,但我很难找到一种执行上述逻辑的方法。

Here is the code for textNumberToHit: 这是textNumberToHit的代码:

 final Random numtofind = new Random();
 final TextView textNumberToHit = (TextView) findViewById(R.id.numbertofind);
        textNumberToHit.setText(String.valueOf(numtofind.nextInt(51)));

Here is the code for textGeneratenumber: 这是textGeneratenumber的代码:

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;
            }
    });

Here is a picture for you to better understand: 这是一张图片,您可以更好地了解: 例

How would I accomplish this? 我将如何完成?

Think about it this way. 这样想吧。 Here is a (simplified) procedure based on what you are asking. 根据您的要求,这是一个(简化的)过程。

  1. I generate a random number and it is 17. 我生成一个随机数,它是17。
  2. I generate a second random number and it must be 17. 我生成了第二个随机数,它必须是17。

Q: What is the logical / mathematical flaw in the description of that procedure? 问:该程序描述中的逻辑/数学缺陷是什么?
A: Clearly the second number is NOT a random number! 答:显然第二个数字不是随机数!

So here's what you need to do. 这就是您需要做的。 (Simplified version!) (简体版!)

  1. Generate 12 different 1 random numbers and assign them to the 12 buttons. 生成12个不同的1个随机数,并将其分配给12个按钮。
  2. Generate a random button index between 1 and 12. 生成1到12之间的随机按钮索引。
  3. Get the value of that button, and assign it to the "number to find" text box. 获取该按钮的值,并将其分配给“要查找的数字”文本框。

.... or something like that. .... 或类似的东西。


1 - At least, I assume they need to be different. 1-至少,我认为它们需要有所不同。 Your game is going to look rather odd if you occasionally see the "number to be found" on multiple buttons .... 如果您偶尔在多个按钮上看到“要查找的数字”,则您的游戏看起来会很奇怪。

Something I would recommend to begin with is rather than having 12 static TextView's to use a GridView: https://developer.android.com/guide/topics/ui/layout/gridview.html 我建议首先使用的不是使用GridView的12个静态TextView: https : //developer.android.com/guide/topics/ui/layout/gridview.html

To Answer your question with what you have though; 用什么来回答你的问题; This is how i would approach the problem: 这就是我要解决的问题:

Steps: 脚步:

  1. Save the value of numtofind.nextInt(51) in a variable. 将numtofind.nextInt(51)的值保存在变量中。
  2. Create another random number generator that will determine which of the 12 TextViews to insert that stored value into. 创建另一个随机数生成器,该生成器将确定将存储的值插入12个TextView中的哪个。 Then insert that value in that TextView. 然后将该值插入该TextView中。
  3. Insert random numbers in the remaining textviews. 在其余的textview中插入随机数。

Code: 码:

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;
        }
});

The first thing is, you want to store the value of generated number to hit: 第一件事是,您要存储要打的生成数字的值:

 final Random numtofind = new Random();
 final TextView textNumberToHit = (TextView) findViewById(R.id.numbertofind);
 int generatedNumber = numtofind.nextInt(51);
        textNumberToHit.setText(String.valueOf(generatedNumber));

Now, you are generating 12 other random numbers for your textGenerateNumber. 现在,您正在为textGenerateNumber生成其他12个随机数。 There are following problems with it: 它存在以下问题:

  1. Two or more numbers (wrong ones) could be repeated. 可以重复两个或多个数字(错误的数字)。
  2. Two or more correct numbers could be repeated. 可以重复两个或更多个正确的数字。

So, first I would create 12 unique randoms. 因此,首先,我将创建12个唯一随机数。

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; 

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM