【问题标题】:Java (generating numbers with no repeats )Java(生成没有重复的数字)
【发布时间】:2012-02-04 23:05:07
【问题描述】:

我正在制作一个应用程序,下面的代码应该生成 7 个随机数并将它们打印到屏幕上,并且没有一个数字应该与另一个相同。

我已经尝试了各种方法。我花了大约 5 个小时检查它,获得第二意见,他们说它应该有效,但它没有。 它有什么作用?它只是将 7 个随机数写入屏幕,但大多数时候有重复,大多数时候应用程序只是停止(错误),但代码中没有错误。这只是我尝试过的许多方法中的一种。 如果有什么不对,有人可以告诉我吗?或有什么建议?或者好心给我一些示例代码来替换while循环?任何建议都会很好记住我对java很陌生。

更新:while循环是主循环。它调用一个 numbers 方法并生成 7 个随机数并将它们存储在“text_counter”数组中,然后我检查它们是否是数组中的重复数字,如果不是,它会跳出循环并将它们打印到屏幕上,但是如果有,则返回循环的开头以生成更多随机数并再次检查。

这里是代码

import java.util.HashSet;
import java.util.Random;
import java.util.Set;

import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;

public class Lotto extends Activity {

/** Called when the activity is first created. */
Random dice = new Random();
TextView top, med, and, qcounter, wcounter, ecounter, rcounter, tcounter,
        ycounter, ucounter;
@SuppressWarnings("rawtypes")
Set uniqueItems = new HashSet();
Button gen;
EditText input1, input2;
int[] text_counter = { 1, 2, 3, 4, 5, 6, 7 };
boolean o = false;
boolean oo = false;
boolean ooo = false;
int text1;
int pre_text2;
int count = 0;
int text2;

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.lotto_xml);
    gen = (Button) findViewById(R.id.b_gen);
    // ////////////////////////////////////// text view var
    qcounter = (TextView) findViewById(R.id.q_lotto);
    wcounter = (TextView) findViewById(R.id.w_lotto);
    ecounter = (TextView) findViewById(R.id.e_lotto);
    rcounter = (TextView) findViewById(R.id.r_lotto);
    tcounter = (TextView) findViewById(R.id.t_lotto);
    ycounter = (TextView) findViewById(R.id.y_lotto);
    ucounter = (TextView) findViewById(R.id.u_lotto);
    // ////////////////////////////////////////////////////
    final EditText input1 = (EditText) findViewById(R.id.et_min);
    final EditText input2 = (EditText) findViewById(R.id.et_max);

    gen.setOnClickListener(new View.OnClickListener() {

        @SuppressWarnings({ "unchecked" })
        @Override
        public void onClick(View v) {
            // TODO Auto-generated method stub

            o = false;
            oo = false;
            count = 0;

            while (o == false) {
                number();
                count = 0;
                for (int i = 0; i < text_counter.length; i++) {
                    if (!uniqueItems.add(text_counter[i])) {
                        count = count + 1;
                    }

                }

                if (count == 0) {
                    o = true;
                }

            }

            qcounter.setText(String.valueOf(text_counter[0]) + ",");
            wcounter.setText(String.valueOf(text_counter[1]) + ",");
            ecounter.setText(String.valueOf(text_counter[2]) + ",");
            rcounter.setText(String.valueOf(text_counter[3]) + ",");
            tcounter.setText(String.valueOf(text_counter[4]) + ",");
            ycounter.setText(String.valueOf(text_counter[5]) + ",");
            ucounter.setText(String.valueOf(text_counter[6]));

        }


        private void number() {
            // TODO Auto-generated method stub
            text1 = Integer.parseInt(input1.getText().toString());
            text2 = Integer.parseInt(input2.getText().toString());
            text2 = text2 - text1;
            text2 = text2 + 1;
            for (int i = 0; i < 7; i++) {
                text_counter[i] = text1 + dice.nextInt(text2);
            }
        }

    });

}
}

【问题讨论】:

  • 如果应用程序“停止(错误)”,那么肯定存在“代码错误”。
  • 应用程序只是停止响应并强制关闭,它可能卡在循环中或其他什么东西,我只是打算这是某种类型的错误。
  • String.valueOf(text_counter[0]) + ","text_counter[0] + "," 相同
  • 如果您保证没有重复,那么这些数字并不是真正随机的。
  • @MikeBaranczak 什么是“真正随机的”? xkcd.com/221

标签: java android random numbers


【解决方案1】:

有很多方法可以做到这一点。

一种简单的方法是生成数字并将它们放入hashmap。你不断生成,直到你有 7 个唯一的数字。如果你遇到碰撞,你会再生。

一个更好的主意,但使用更多的内存,是有一个一定大小的位数组。每个位代表一个数字。然后你生成随机数:

while (counter != 7){
  randomNumber= ...Random.nextInt();
  if ([randomNumber % bitArray.length] != 0){
     print(randomNumber % bitArray.length)
     [randomNumber % bitArray.length]= 0;
     counter++
   }    

}

【讨论】:

    【解决方案2】:

    与其创建所有新数字,不如执行以下操作

    private void number() {
        text1 = Integer.parseInt(input1.getText().toString());
        text2 = Integer.parseInt(input2.getText().toString());
        text2 = text2 - text1;
        text2 = text2 + 1;
        if (text2 < 7) {
            throw new IllegalArgumentException("Can not generate 7 unique renumbers between " + text1 + " and " + (text1 + text2));
        }
        int[] text_counter = new int[7];
        for (int i = 0; i < 7; i++) {
            boolean duplicate;
            do {
                text_counter [i] = text1 + dice.nextInt(text2);
                duplicate = false; // Starting assumption
                for (int j = 0; j < i; j++) {
                    if (text_counter[j] == text_counter[i]) {
                        duplicate = true;
                    }
                }
            } while (duplicate);
        }
    }
    

    【讨论】:

    • 对不起,检查错了(不应该没有测试就输入代码)
    【解决方案3】:

    您永远不会清除名为 uniqueItems 的 HashSet。您应该在每次循环之前清除它,否则您将永远在其中累积数字。

    【讨论】:

    • 用一个可能叫做clear()的方法?呸!请不要在 StackOverflow 上提出问题,只需快速查看文档即可轻松回答。
    • @EliAcherkan 我想我有问题。
    • 没关系,我也有同样的问题。它们来自于您将自己的时间用于回答那些完全无助且懒得尝试为自己寻找答案的人提出的问题。
    • @MikeNakis 我总是想知道为什么有些人会问一个问题(如何清除它?),使用您已经打开的 IDE 需要 5 秒才能回答。从 IDE 获得答案比从论坛获得答案更快,那么为什么要浪费某人宝贵的个人时间呢?
    • @PeterMasar 是的,这对我来说也是人类的一大谜团,彼得。
    【解决方案4】:

    不是检查数组是否有重复并重试,而是在添加之前检查最近生成的数字是否已经在数组中。如果是,您可以再次生成数字,而不会丢弃之前的工作。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-03-01
      • 1970-01-01
      • 1970-01-01
      • 2016-05-15
      • 1970-01-01
      • 1970-01-01
      • 2021-10-23
      相关资源
      最近更新 更多