我试图得到6个随机数,但它有效,但有时它们中的一些是相同的。我可以添加什么来检查随机数1 =随机数2然后改变?
public void onClick(View v) {
Random r1 = new Random();
Random r2 = new Random();
Random r3 = new Random();
Random r4 = new Random();
Random r5 = new Random();
Random r6 = new Random();
int i1=r1.nextInt(46-1) + 1;
int i2=r2.nextInt(46-1) + 1;
int i3=r3.nextInt(46-1) + 1;
int i4=r4.nextInt(46-1) + 1;
int i5=r5.nextInt(46-1) + 1;
int i6=r6.nextInt(46-1) + 1;
EditText edit1=(EditText)findViewById(R.id.edit1);
edit1.setText(String.valueOf(i1));
EditText edit2=(EditText)findViewById(R.id.edit2);
edit2.setText(String.valueOf(i2));
EditText edit3=(EditText)findViewById(R.id.edit3);
edit3.setText(String.valueOf(i3));
EditText edit4=(EditText)findViewById(R.id.edit4);
edit4.setText(String.valueOf(i4));
EditText edit5=(EditText)findViewById(R.id.edit5);
edit5.setText(String.valueOf(i5));
EditText edit6=(EditText)findViewById(R.id.edit6);
edit6.setText(String.valueOf(i6));
答案 0 :(得分:2)
private Set<Integer> getRandoms(int max) {
Set<Integer> randoms = new HashSet<Integer>();
Random r = new Random();
while (randoms.size() != max) {
int possibleNumber = r.nextInt(46-1) + 1;
randoms.add(possibleNumber); // This will check to see if the element is already there
}
return randoms;
}
这将确保您没有重复项。
答案 1 :(得分:1)
首先,在彼此之后创建6个Random是非常糟糕的做法,因为它们使用当前时间来播种随机生成器。所以,如果你有一个快速的CPU,也许一些randoms可能有相同的种子,并将产生相同的数字。为了解决这个问题,请创建一个随机的并使用那个。
更新:我查看了Random构造函数的代码,我看到它使用System.nanoTime()
来播种。这应该在你从一个Random构造函数到另一个构造函数的时候更新
更新II: @nandeesh 表示Android中的Random使用System.currentTimeMillis() + System.identityHashCode(this)
。这是以毫秒为单位的时间加上Java对象的内存地址。如果你可以在同一毫秒内创建两个Random,我不确定获得不同数字是多么安全。
其次,要修复重复项(这是真的可能),只需将随机数放在一个数组中,每次添加一个,检查它是否已存在于以前的数组中。做类似的事情:
int num = 6;
int[] randoms = new int[num];
Random r = new Random();
outer:
for (int i = 0; i < num; ++i)
{
int rand = r.nextInt(45) + 1;
for (int j = 0; j < i; ++j)
{
if (randoms[j] == rand)
{
--i;
continue outer;
}
}
randoms[i] = rand;
}
答案 2 :(得分:1)
如果您想避免重复,请创建45种可能性的列表,将其随机播放(Collections.Shuffle)
并取第6个。
List<Integer> numbers = new ArrayList<>();
for(int i = 0; i < 45; i++){
numbers.add(i);
}
Collections.shuffle(numbers);
for(int i = 0; i < 6; i++) {
System.out.println(numbers.get(i));
}
如果您不介意重复,请仅使用一个Random
实例并将其调用6次。
答案 3 :(得分:0)
尝试在Random构造函数中使用“seed” 如
Random r1 = new Random(10);
Random r2 = new Random(100);
int num1 =r1.nextInt(45);
int num2 =r2.nextInt(45);
通常认为让6个随机对象做同样的事情是不好的做法。代码可以缩减为
Random r1 = new Random(10);
int num1 =r1.nextInt(45);
int num2 =r1.nextInt(45);
答案 4 :(得分:0)
这就是你想要的:
public void onClick(View v) {
ArrayList<Integer> list = new ArrayList();
Random r = new Random();// one time is enough
for(int i = 0; i< list.size(); i++){//loop through the list of integers
int temp = r.nextInt(45) + 1; //save te random int.
for(int j = 0; i< list.size(); j++){//loop through te list of int to chec if it exists
if(temp == list.get(j)) {return;}//if exists stop.
}
list.add(temp);//save
}
EditText edit1=(EditText)findViewById(R.id.edit1);
edit1.setText(String.valueOf(list.get(0)));
EditText edit2=(EditText)findViewById(R.id.edit2);
edit2.setText(String.valueOf(list.get(1)));
EditText edit3=(EditText)findViewById(R.id.edit3);
edit3.setText(String.valueOf(list.get(2)));
EditText edit4=(EditText)findViewById(R.id.edit4);
edit4.setText(String.valueOf(list.get(3)));
EditText edit5=(EditText)findViewById(R.id.edit5);
edit5.setText(String.valueOf(list.get(4)));
EditText edit6=(EditText)findViewById(R.id.edit6);
edit6.setText(String.valueOf(list.get(5)));
}
答案 5 :(得分:-2)
这个怎么样?
int numberOfnumbers = 1000;
List<Integer> numbers = new ArrayList<Integer>();
for (int i = 0; i < numberOfNumbers; i++) {
numbers.add(i);
}
Collections.shuffle(numbers);
尽可能多的数字,随机并保证不重复。只需要前6个,或者你需要多少。