Подтвердить что ты не робот

Получить случайный логический в Java

Хорошо, я реализовал этот SO вопрос в своем коде: вернуть True или False в случайном порядке

Но у меня странное поведение: мне нужно запустить десять экземпляров одновременно, где каждый экземпляр возвращает 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 каждый раз как результат...

4b9b3361

Ответ 1

Я рекомендую использовать 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) вы работаете с нестандартной сломанной реализацией.

Ответ 4

Java 8. Используйте случайный генератор, выделенный для текущего потока: ThreadLocalRandom nextBoolean()

Подобно глобальному генератору случайных чисел, используемому классом Math, ThreadLocalRandom инициализируется внутренним сгенерированным семенем, которое в противном случае не может быть изменено. Когда это применимо, использование ThreadLocalRandom, а не общих случайных объектов в параллельных программах, как правило, сталкивается с гораздо меньшими накладными расходами и конфликтами.

java.util.concurrent.ThreadLocalRandom.current().nextBoolean();

Ответ 5

Почему бы не использовать класс 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);
    }
  }
}

Ответ 6

Самый простой способ инициализации генератора случайных чисел - использовать конструктор без параметров, например

Random generator = new Random();

Однако при использовании этого конструктора вы должны признать, что алгоритмические генераторы случайных чисел не являются действительно случайными, они действительно являются алгоритмами, которые генерируют фиксированную, но случайную последовательность чисел.

Вы можете сделать его более "случайным", предоставив произвольному конструктору параметр "seed", который вы можете динамически построить, например, используя системное время в миллисекундах (которое всегда будет отличаться)

Ответ 7

вы можете получить свое значение 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;
}

numbers 55555.. и 444.. - большие числа, чтобы получить функцию широкого диапазона пожалуйста, игнорируйте значок skype: D

Ответ 8

Вы можете использовать следующее для объективного результата:

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;

Ответ 9

Слова в тексте всегда являются источником случайности. По определенному слову ничего не следует из следующего слова. Для каждого слова мы можем взять ASCII-коды его букв, добавить эти коды, чтобы сформировать число. Соотношение этого числа является хорошим кандидатом на случайное логическое значение.

Возможные недостатки:

  1. эта стратегия основана на использовании текстового файла в качестве источника слов. В какой-то момент конец файла будет достигнут. Однако вы можете оценить, сколько раз вы ожидаете вызова функции randomBoolean() из вашего приложения. Если вам нужно будет вызывать его около 1 миллиона раз, тогда текстового файла с 1 миллионом слов будет достаточно. В качестве исправления вы можете использовать поток данных из живого источника, такого как онлайн-газета.

  2. используя некоторый статистический анализ общих фраз и идиом в языке, можно оценить следующее слово в фразе, учитывая первые слова фразы, с некоторой степенью точности. Но статистически эти случаи редки, когда мы можем точно предсказать следующее слово. Таким образом, в большинстве случаев следующее слово не зависит от предыдущих слов.

    пакет р01;

    импорт java.io.File; импорт java.nio.file.Files; импорт 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

Ответ 10

  • Создайте целочисленное случайное число, INTEGER_RANDOM_NUMBER

  • return (INTEGER_RANDOM_NUMBER и 1)

Ответ 11

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

Random rand = new Random();

Объявить диапазон для управления случайной вероятностью. В этом примере существует 50% вероятность быть правдой.

int range = 2;

Создать 2 случайных числа.

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

Затем просто сравните возвращаемое значение.

return a == b; 

У меня также есть класс, который вы можете использовать. RandomRange.java