我正在创建一个应用程序,下面的代码应该生成7个随机数并将它们打印到屏幕上,而且这些数字都不应该与另一个相同。
我已经尝试过各种方式。我花了大约5个小时检查它,得到第二个意见,他们说它应该工作,但事实并非如此。 它有什么作用?它只是将7个随机数写入屏幕,但大部分时间都有重复,大部分时间应用程序停止(错误),但代码中没有错误。这只是我尝试过的许多方法中的一种方式。 有人可以告诉我,如果有什么不对吗?还是有建议?还是那么善意给我一些示例代码来替换while循环?任何建议都会很棒,请记住我对java很新。
更新:while循环是主循环。它调用一个数字方法并生成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);
}
}
});
}
}
答案 0 :(得分:6)
您永远不会清除名为uniqueItems
的HashSet。你应该在每个循环之前清除它,否则你将永远在那里累积数字。
答案 1 :(得分:2)
不是检查数组是否有重复并再次尝试,而是在添加之前检查最近生成的数字是否已在数组中。如果是,您可以再次生成该号码,而不会丢弃以前的工作。
答案 2 :(得分:1)
有很多方法可以做到这一点。
一种简单的方法是生成数字并将它们放在hashmap
中。你会继续生成,直到有7个唯一的数字。如果遇到碰撞,就会重新生成。
更好的想法,但使用更多内存,是有一个大小的位数组。每个位代表一个数字。然后生成随机数:
while (counter != 7){
randomNumber= ...Random.nextInt();
if ([randomNumber % bitArray.length] != 0){
print(randomNumber % bitArray.length)
[randomNumber % bitArray.length]= 0;
counter++
}
}
答案 3 :(得分:0)
而不是创建所有新数字,如何执行以下操作
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);
}
}