Как создать в Android Java случайное число между min и max, исключая некоторые числа, которые находятся между min и max.? - PullRequest
1 голос
/ 11 октября 2011

Как создать в Android Java случайное число между min и max, исключая некоторые числа, которые попадают между min и max .?

У меня есть три числа, каждое из которых является случайным числом от 1 до 100.Я смог сделать случайное число, используя math.rand (), но я пытаюсь убедиться, что три числа не совпадают.Я работал с использованием операторов while и if, но я искал, есть ли одна строка команды, чтобы сделать это, чтобы я мог поместить ее прямо в класс деятельности, чтобы он был общедоступным var.и в этой области (деятельности) я не могу использовать операторы while и if, я могу только в onCreate из-за пустоты или чего-то еще.

Заранее благодарим за помощь и проголосуем за любую помощь или идею, которая приведет к поиску какой-либо информации по этому поводу.

Ответы [ 5 ]

2 голосов
/ 11 октября 2011

Нет необходимости в «одной командной строке». Вы можете использовать блоки конструктора или инициализатора, чтобы делать что угодно.

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 голос
/ 11 октября 2011

Это должно быть сделано с помощью некоторых условных выражений (if, while, do-while и т. Д.), Поскольку сгенерированные числа должны быть «проверены», чтобы увидеть, равны ли они.

Если переменные являются статическими, вы должны инициализировать их в предложении статической конструкции:

public class MyClass {
    public static final int a, b, c;

    static {
        // generate the random numbers here //
    }
}

Если они не являются статичными, вы можете инициализировать их в методе OnCreate действия. В случае использования их до того, как действие будет вызвано или они помечены как завершающие, вы должны инициализировать их в конструкторе действия.

1 голос
/ 11 октября 2011

Все эти программы по сути являются генераторами псевдослучайных чисел, а не генераторами истинных случайных чисел. Так что в некоторых угловых / удаленных случаях может случиться так, что вы получите одно и то же случайное число, сгенерированное последовательно. Так что нет другого варианта, кроме как положить цикл while / if else для обработки таких угловых случаев. Так что я думаю, что вы уже делаете правильные идеальные вещи, и хотя цикл / если еще блоки не должны быть проблемой, так как столкновения со случайными числами будут в редких случаях.

0 голосов
/ 12 октября 2011

Это мой код 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);
}}
0 голосов
/ 11 октября 2011

Если вы хотите получить 3 разных случайных числа без каких-либо 'if' или 'while', вы можете использовать метод getThreeRandomInt. (Я создаю справочный класс 'Dots' для тестов, это не несессеры)

package Random;

import static org.junit.Assert. *;

import java.util.Random;

import org.junit.Test;

открытый класс getThreeRandomInt { открытый статический класс 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];
}

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

}

...