web-dev-qa-db-ja.com

Javaでランダムなブール値を取得します

さて、次のSO質問をコードに実装しました。 TrueまたはFalseをランダムに返す

しかし、奇妙な動作があります。10個のインスタンスを同時に実行する必要があり、すべてのインスタンスが実行ごとに1回だけtrueまたはfalseを返します。そして驚くべきことに、私が何をしても、私はただfalseを取得するたびに

メソッドを改善する何かがあるので、少なくとも約50%の確率でtrueを取得できますか?


より理解しやすくするために、アプリケーションをJARファイルにビルドし、それをバッチコマンドで実行します

 Java -jar my-program.jar
 pause

プログラムの内容-できるだけシンプルにするため:

public class myProgram{

    public static boolean getRandomBoolean() {
        return Math.random() < 0.5;
        // I tried another approaches here, still the same result
    }

    public static void main(String[] args) {
        System.out.println(getRandomBoolean());  
    }
}

10個のコマンドラインを開いて実行すると、毎回falseが返されます...

61
Pavel Janicek

Random.nextBoolean() を使用することをお勧めします

そうは言っても、使用したMath.random() < 0.5も機能します。これが私のマシンの動作です:

$ cat myProgram.Java 
public class myProgram{

   public static boolean getRandomBoolean() {
       return Math.random() < 0.5;
       //I tried another approaches here, still the same result
   }

   public static void main(String[] args) {
       System.out.println(getRandomBoolean());  
   }
}

$ javac myProgram.Java
$ Java myProgram ; Java myProgram; Java myProgram; Java myProgram
true
false
false
true

言うまでもなく、毎回異なる値を取得するための保証がありません。しかし、あなたの場合、私はそれを疑います

A)自分が考えているコードを使用していない(間違ったファイルを編集するなど)

B)テスト時に異なる試行をコンパイルしていない、または

C)非標準の壊れた実装で作業している。

91
aioobe

nextBoolean()- Methodを試すこともできます

例を次に示します。 http://www.tutorialspoint.com/Java/util/random_nextboolean.htm

29
Sagi

Sun(Oracle)のドキュメントを見ようとしましたか?

http://docs.Oracle.com/javase/1.4.2/docs/api/Java/util/Random.html#nextBoolean ()

とにかくここにサンプルコードがあります:

    Java.util.Random

    Random random = new Random();
    random.nextBoolean();
24
TheNewOne

Java 8:現在のスレッドに分離されたランダムジェネレーターを使用: ThreadLocalRandom nextBoolean()

Mathクラスで使用されるグローバルランダムジェネレーターと同様に、ThreadLocalRandomは内部で生成されたシードで初期化されます。該当する場合、並行プログラムで共有RandomオブジェクトではなくThreadLocalRandomを使用すると、通常、オーバーヘッドと競合がはるかに少なくなります。

Java.util.concurrent.ThreadLocalRandom.current().nextBoolean();
5
wildloop

メソッドRandomを持つ nextBoolean クラスを使用しない理由:

import Java.util.Random;

/** Generate 10 random booleans. */
public final class MyProgram {

  public static final void main(String... args){

    Random randomGenerator = new Random();
    for (int idx = 1; idx <= 10; ++idx){
      boolean randomBool = randomGenerator.nextBoolean();
      System.out.println("Generated : " + randomBool);
    }
  }
}
2
fanf

乱数ジェネレーターを初期化する最も簡単な方法は、たとえば、パラメーターのないコンストラクターを使用することです

Random generator = new Random();

ただし、このコンストラクターを使用する際には、アルゴリズムの乱数ジェネレーターは真にランダムではなく、固定されているがランダムに見える一連の数字を生成するアルゴリズムであることに注意してください。

Randomコンストラクターに「シード」パラメーターを与えることで、より「ランダム」に見せることができます。これは、例えばミリ秒単位のシステム時間(常に異なる)を使用して動的に構築できます。

0
PoeHaH

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

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

2つのランダムな整数を作成し、それらが同じかどうかを確認することもできます。これにより、確率をより詳細に制御できます。

Random Rand = new Random();

範囲を宣言して、ランダムな確率を管理します。この例では、50%の可能性があります。

int range = 2;

2つのランダムな整数を生成します。

int a = Rand.nextInt(range);
int b = Rand.nextInt(range);

次に、単純に比較して値を返します。

return a == b; 

また、使用できるクラスもあります。 RandomRange.Java

0
Angel Fernandez

clock()値を取得して、奇数か偶数かを確認できます。それが本当の%50かどうかわからない

また、ランダム関数をカスタム作成できます。

static double  s=System.nanoTime();//in the instantiating of main applet
public static double randoom()
{

s=(double)(((555555555* s+ 444444)%100000)/(double)100000);


    return s;
}

番号55555 ..および444 ..は、広い範囲の機能を得るための大きな数字です。スカイプアイコンは無視してください:D

テキスト内の単語は常にランダム性の原因です。特定の単語を考えると、次の単語については何も推測できません。各Wordについて、その文字のASCIIコードを取得し、それらのコードを追加して数値を形成できます。この数のパリティは、ランダムなブール値の良い候補です。

考えられる欠点:

  1. この戦略は、テキストファイルを単語のソースとして使用することに基づいています。ある時点で、ファイルの最後に到達します。ただし、アプリからrandomBoolean()関数を呼び出すと予想される回数を見積もることができます。約100万回呼び出す必要がある場合は、100万語のテキストファイルで十分です。修正として、オンライン新聞のようなライブソースからのデータのストリームを使用できます。

  2. 言語の一般的なフレーズとイディオムの統計分析を使用して、フレーズの最初の単語が与えられると、ある程度正確にフレーズの次の単語を推定できます。しかし、統計的には、次の単語を正確に予測できる場合、これらのケースはまれです。したがって、ほとんどの場合、次の単語は前の単語から独立しています。

    パッケージp01;

    import Java.io.File; import Java.nio.file.Files; import Java.nio.file.Paths;

    パブリッククラスMain {

    String words[];
    int currentIndex=0;
    
    public static String readFileAsString()throws Exception 
      { 
        String data = ""; 
        File file = new File("the_comedy_of_errors");
        //System.out.println(file.exists());
        data = new String(Files.readAllBytes(Paths.get(file.getName()))); 
        return data; 
      } 
    
    public void init() throws Exception
    {
        String data = readFileAsString(); 
        words = data.split("\\t| |,|\\.|'|\\r|\\n|:");
    }
    
    public String getNextWord() throws Exception
    {
        if(currentIndex>words.length-1)
            throw new Exception("out of words; reached end of file");
    
        String currentWord = words[currentIndex];
        currentIndex++;
    
        while(currentWord.isEmpty())
        {
            currentWord = words[currentIndex];
            currentIndex++;
        }
    
        return currentWord;
    }
    
    public boolean getNextRandom() throws Exception
    {
        String nextWord = getNextWord();
        int asciiSum = 0;
    
        for (int i = 0; i < nextWord.length(); i++){
            char c = nextWord.charAt(i);        
            asciiSum = asciiSum + (int) c;
        }
    
        System.out.println(nextWord+"-"+asciiSum);
    
        return (asciiSum%2==1) ;
    }
    
    public static void main(String args[]) throws Exception
    {
        Main m = new Main();
        m.init();
        while(true)
        {
            System.out.println(m.getNextRandom());
            Thread.sleep(100);
        }
    }
    

    }

Eclipseでは、私のプロジェクトのルートに「the_comedy_of_errors」(拡張子なし)というファイルがあります-File> New> Fileで作成され、ここからいくつかのコンテンツを貼り付けました: http://shakespeare.mit .edu/comedy_errors/comedy_errors.1.1.html

0
wile the coyote