web-dev-qa-db-ja.com

ランダムにTrueまたはFalseを返す

trueまたはfalseをランダムに返すJavaメソッドを作成する必要があります。これどうやってするの?

60
Bishan

クラス Java.util.Randomはすでにこの機能を備えています。

public boolean getRandomBoolean() {
    Random random = new Random();
    return random.nextBoolean();
}

ただし、ランダムなブール値が必要になるたびに新しいRandomインスタンスを常に作成するのは効率的ではありません。代わりに、ランダムなブール値を必要とするRandom型の属性を作成し、新しいランダムなブール値ごとにそのインスタンスを使用します。

public class YourClass {

    /* Oher stuff here */

    private Random random;

    public YourClass() {
        // ...
        random = new Random();
    }

    public boolean getRandomBoolean() {
        return random.nextBoolean();
    }

    /* More stuff here */

}
104
buc

(Math.random() < 0.5)は、ランダムにtrueまたはfalseを返します

55
Hachi

これはする必要があります:

public boolean randomBoolean(){
    return Math.random() < 0.5;
}
14

次のコードとして行うことができます、

public class RandomBoolean {
    Random random = new Random();
    public boolean getBoolean() {
        return random.nextBoolean();
    }
    public static void main(String[] args) {
        RandomBoolean randomBoolean = new RandomBoolean();
        for (int i = 0; i < 10; i++) {
            System.out.println(randomBoolean.getBoolean());
        }
    }
}

これがお役に立てば幸いです、ありがとう。

5
Ahamed

これで取得できます:

return Math.random() < 0.5;
2
Amit Pathak

公平な結果を得るには、次を使用できます。

Random random = new Random();
//For 50% chance of true
boolean chance50oftrue = (random.nextInt(2) == 0) ? true : false;

注: random.nextInt(2)は、数値2が境界であることを意味します。カウントは0から始まります。したがって、2つの可能な数値(0と1)があるため、確率は50%です。

結果が真(または偽)になる確率を高めたい場合は、次のように上記を調整できます!

Random random = new Random();

//For 50% chance of true
boolean chance50oftrue = (random.nextInt(2) == 0) ? true : false;

//For 25% chance of true
boolean chance25oftrue = (random.nextInt(4) == 0) ? true : false;

//For 40% chance of true
boolean chance40oftrue = (random.nextInt(5) < 2) ? true : false;
0
christouandr7

JavaのRandomクラスは、CPUの内部クロックを使用します(私の知る限り)。同様に、ランダム性のソースとしてRAM情報を使用できます。Windowsタスクマネージャの[パフォーマンス]タブを開いて、物理メモリ-利用可能:常に変化します;ほとんどの場合、値は毎秒更新されますが、まれにのみ値が数秒間一定のままです。さらに頻繁に変化する他の値はシステムハンドルとスレッドですが、cmdコマンドを使用して値を取得するため、この例では、ランダム性のソースとしてAvailable Physical Memoryを使用します。

_import Java.io.BufferedReader;
import Java.io.IOException;
import Java.io.InputStreamReader;

public class Main {

    public String getAvailablePhysicalMemoryAsString() throws IOException
    {
        Process p = Runtime.getRuntime().exec("cmd /C systeminfo | find \"Available Physical Memory\"");
        BufferedReader in = 
                new BufferedReader(new InputStreamReader(p.getInputStream()));
        return in.readLine();
    }

    public int getAvailablePhysicalMemoryValue() throws IOException
    {
        String text = getAvailablePhysicalMemoryAsString();
        int begin = text.indexOf(":")+1;
        int end = text.lastIndexOf("MB");
        String value = text.substring(begin, end).trim();

        int intValue = Integer.parseInt(value);
        System.out.println("available physical memory in MB = "+intValue);
        return intValue;
    }

    public boolean getRandomBoolean() throws IOException
    {
        int randomInt = getAvailablePhysicalMemoryValue();
        return (randomInt%2==1);
    }


    public static void main(String args[]) throws IOException
    {       
        Main m = new Main();
        while(true)
        {
            System.out.println(m.getRandomBoolean());
        }
    }
}
_

ご覧のとおり、コア部分はRuntime.getRuntime().exec()を使用してcmd systeminfoコマンドを実行しています。

簡潔にするために、try-catchステートメントは省略しました。このプログラムを数回実行してもエラーは発生しませんでした-cmdコマンドの出力には常に「使用可能な物理メモリ」行があります。

考えられる欠点:

  1. このプログラムの実行には多少の遅延があります。 main() functionには、while(true)ループ内にThread.sleep()がなく、それでも、出力は1秒に1回程度しかコンソールに出力されないことに注意してください。 。
  2. 使用可能なメモリは、新しく開いたOSセッションに対して一定である可能性があります-確認してください。実行しているプログラムはわずかで、値は毎秒変化しています。サーバー環境でこのプログラムを実行する場合、呼び出しごとに異なる値を取得することは問題になりません。
0
wile the coyote