如何在Android Java中创建一个介于min和max之间的随机数,不包括介于min和max之间的一些数字?
我有三个变量,每个都是1-100之间的随机数。我能够使用math.rand()来做随机数,但我试图确保这三个数字不匹配。我做了一个关于使用while和if语句的工作,但我想看看是否有一行命令来做这个,所以我可以把它放在活动类下面,这样它就是public var。并且在那个区域(活动)我不能使用while和if语句,我只能在onCreate由于空白或其他东西。
提前感谢您的帮助,并会投票选出任何有助于找到相关信息的帮助或想法。
答案 0 :(得分:2)
不需要“一行命令”。您可以使用构造函数或初始化程序块来执行您想要的任何操作。
public class blah
{
public int a, b, c;
// this runs when the object is created
{
Random r = new Random();
a = r.nextInt(100) + 1;
do { b = r.nextInt(100) + 1; } while (a == b);
do { c = r.nextInt(100) + 1; } while (a == c || b == c);
}
}
当然,你也可以把这些东西放到构造函数中 - 事实上,这就是Java在看到它时用它做的事情。甚至像public int x = 1;
这样的初始化实际上也会进入构造函数。将它放在构造函数中的唯一缺点是,您需要将它添加到每个构造函数中,而如果您使用初始化器(块或单个语句),Java会为您执行此操作。
答案 1 :(得分:1)
所有这些软件程序本质上都是伪随机数生成器,而不是真正的随机数生成器。因此,在某些角落/远程情况下,您最终可能会连续生成相同的随机数。因此除了使用while / if else块来处理这样的极端情况之外没有其他选择。所以我认为你已经做了正确的理想事情,而loop / if else块不应该是问题,因为随机数碰撞将是罕见的情况。
答案 2 :(得分:1)
必须通过一些条件表达式(if,while,do-while等)来完成,因为必须“检查”生成的数字以查看它们是否相等。
如果变量是静态的,则应在static construction子句中初始化它们:
public class MyClass {
public static final int a, b, c;
static {
// generate the random numbers here //
}
}
如果它们不是静态的,您可以在活动的OnCreate方法中初始化它们。如果在调用活动之前使用它们或将它们标记为final,则应在活动的构造函数中初始化它们。
答案 3 :(得分:0)
如果你想获得3个不同的随机整数而没有'if'或'while'你可以使用getThreeRandomInt方法。 (我为测试创建帮助类'Dots',这不是nessesery)
package Random;
import static org.junit.Assert。*;
import java.util.Random;
import org.junit.Test;
public class getThreeRandomInt { 公共静态类点 { public int a; public int b; public int c;
public Dots()
{
a = 0;
b = 0;
c = 0;
}
@Override
public String toString()
{
return "[" + a + "]" + "[" + b + "]" + "[" + c + "]";
}
}
public static void getThreeRandomInt(Dots d)
{
int[] arr = new int[100];
Random r = new Random();
for(int i=0; i<arr.length ; i++){
arr[i] = i + 1;
}
int randInt = r.nextInt(100);
d.a = arr[randInt];
for(int i=randInt; i<arr.length - 1 ; i++){
arr[i] = arr[i + 1];
}
randInt = r.nextInt(99);
d.b = arr[randInt];
for(int i=randInt; i<arr.length - 2 ; i++){
arr[i] = arr[i + 1];
}
randInt = r.nextInt(98);
d.c = arr[randInt];
}
@Test
public void test()
{
Dots d = new Dots();
for(int i=0; i<300000; i++){
getThreeRandomInt(d);
assertFalse( d.a == d.b || d.a == d.c || d.b == d.c);
//System.out.println(d.toString());
}
}
}
答案 4 :(得分:0)
这是我的AndroidActivity代码,它有效。
package com.androidbook.droid1;
import java.util.Random;
import android.app.Activity;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.widget.TextView;
public class DroidActivity3 extends Activity
{
public static class GetThreeRandomIntClass
{
public static class Dots
{
public int a;
public int b;
public int c;
public Dots()
{
a = 0;
b = 0;
c = 0;
}
@Override
public String toString()
{
return "[" + a + "]" + "[" + b + "]" + "[" + c + "]";
}
}
public static void getThreeRandomInt(Dots d)
{
int[] arr = new int[100];
Random r = new Random();
for(int i=0; i<arr.length ; i++){
arr[i] = i + 1;
}
int randInt = r.nextInt(100);
d.a = arr[randInt];
for(int i=randInt; i<arr.length - 1 ; i++){
arr[i] = arr[i + 1];
}
randInt = r.nextInt(99);
d.b = arr[randInt];
for(int i=randInt; i<arr.length - 2 ; i++){
arr[i] = arr[i + 1];
}
randInt = r.nextInt(98);
d.c = arr[randInt];
}
}
@Override
protected void onCreate(Bundle savedInstanceState)
{
this.setContentView(R.layout.third);
GetThreeRandomIntClass.Dots d = new GetThreeRandomIntClass.Dots();
GetThreeRandomIntClass.getThreeRandomInt(d);
TextView textView1 = (TextView) this.findViewById(R.id.textView1);
textView1.setText(String.valueOf(d.a));
TextView textView2 = (TextView) this.findViewById(R.id.textView2);
textView2.setText(String.valueOf(d.b));
TextView textView3 = (TextView) this.findViewById(R.id.textView3);
textView3.setText(String.valueOf(d.c));
super.onCreate(savedInstanceState);
}}