80

さて、私はこの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毎回結果が得られます...

4

11 に答える 11

118

使用をお勧めします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)非標準の壊れた実装で作業しています。

于 2012-07-13T10:04:51.237 に答える
40

Javaドキュメントを見てみましたか?

この乱数ジェネレーターのシーケンスから次の疑似乱数で一様分布のブール値を返します...値は(ほぼ)等しい確率で生成されますtruefalse

例えば:

import java.util.Random;

Random random = new Random();
random.nextBoolean();
于 2012-07-13T10:04:14.460 に答える
34

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

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

于 2012-07-13T10:02:51.697 に答える
10

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

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

java.util.concurrent.ThreadLocalRandom.current().nextBoolean();
于 2017-12-19T00:47:57.117 に答える
3

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);
    }
  }
}
于 2012-07-13T10:09:08.983 に答える
1

偏りのない結果を得るには、以下を使用できます。

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;
于 2019-04-07T16:37:47.780 に答える
0

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

Random generator = new Random();

ただし、このコンストラクターを使用する場合、アルゴリズムの乱数ジェネレーターは真にランダムではなく、実際には固定されているがランダムに見える数列を生成するアルゴリズムであることを認識しておく必要があります。

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

于 2012-07-13T10:05:21.097 に答える
0

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

于 2012-07-13T10:14:27.680 に答える
0

また、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

于 2017-07-20T19:19:15.837 に答える
0

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

考えられる欠点:

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

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

    パッケージp01;

    java.io.Fileをインポートします。java.nio.file.Filesをインポートします。import java.nio.file.Paths;

    パブリッククラスメイン{

    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」(拡張子なし)というファイルがあります。「ファイル」>「新規」>「ファイル」で作成され、ここからコンテンツを貼り付けました:http ://shakespeare.mit.edu/comedy_errors /comedy_errors.1.1.html

于 2019-05-02T12:49:59.350 に答える
0

柔軟なブールランダマイザーの場合:

public static rbin(bias){
    bias = bias || 50;
    return(Math.random() * 100 <= bias);
    /*The bias argument is optional but will allow you to put some weight
      on the TRUE side. The higher the bias number, the more likely it is
      true.*/
}

必ず数値を使用してください。そうしないと、バイアスを下げて、より一般的な値を取得する可能性があり0ます。100false

PS:JavaScriptと共通する機能がいくつかあることを除けば、Javaについては何も知りません。このコードを作成するために、JavaScriptの知識と推論力を使用しました。私の答えが機能しないことを期待してください。Y'allはこの回答を編集して、私が気付いていない問題を修正することができます。
于 2021-10-13T00:21:26.310 に答える