生成Math.random数字的问题,0或1

时间:2015-02-09 00:30:09

标签: java random java.util.scanner

我已经在这个网站上发布了很多次这个问题并且相信我已经浏览了很多这么多的YouTube视频而且没有任何东西最终为我工作。正如标题所说,我想要一个随机数,0或1,然后将返回到main(),如下面的代码所示。

import java.util.Scanner;
public class Exercise8Lab7 {
    public static void main(String[] args) {

        Scanner input = new Scanner(System.in);

        int numFlips = 0;
        int heads = 0;
        int tails = 0;
        String answer;


        System.out.print("Please Enter The Number Of Coin Tosses You Want: ");
        numFlips = input.nextInt();

        for(int x = 1;x <= numFlips; x++){
            if(coinToss() == 1){
                answer = "Tails";
                tails++;
            }
            else{
                answer = "Heads";
                heads++;
            }
            System.out.print("\nCoin Toss " + x + ": " + answer);
        }
        System.out.println("\n\n====== Overall Results ======" +
        "\nPercentage Of Heads: " + (heads/numFlips)*100 + "\nPercentage Of Tails: " + (tails/numFlips)*100);
    }

    public static int coinToss(){
        double rAsFloat = 1 * (2 + Math.random( ) );
        int r = (int)rAsFloat;
        return r;
    }
}

许多解决方案都被建议使用我已经完成的util.Random选项并且工作得很好但是我想弄清楚为什么我无法使用它。显然我希望自己的数字是一个int,所以我在生成随机数后将其转换为int。但无论我添加或乘以Math.random(),它总是都是Heads或者都是Tails。永远不要混。

任何帮助表示赞赏!

11 个答案:

答案 0 :(得分:14)

您可以使用基于Math.random()的值的布尔值0或1作为0.0和1.0之间的双倍,并使随机生成器更简单。你可以完全摆脱coinToss()方法。

if(Math.random() < 0.5) {
    answer = "Tails";
    tails++;
}

删除硬币投掷方法,并用上面的代码替换第一个条件。

Math.random();本身将返回介于0.0和小于1.0之间的值。如果该值在下半部分[0.0,0.5],那么它具有处于上半部分的相同概率,[0.5,1.0]。因此,您可以将下半部分中的任何值设置为true,将上部设置为false。

答案 1 :(得分:7)

试试这个)它会生成数字 0 1

 Math.round( Math.random() )  ;

答案 2 :(得分:1)

由于你使用的是整数数学而无法正常工作,对2+ Math.Random的调用几乎总能给出0.0到1.0之间的答案。

所以假设您收到0.25作为结果,您的数学如下

double d = 1* (2 + 0.25); // (result = 2  

然后你要检查你的结果是否= = 1(它永远不会。)

更好的结果是将java.util.Random声明为类变量并调用random.nextBoolean()并简单地对其执行head / tails计算。

如果你要继续使用Math.random()并让我们说

return Math.random() < 0.5

由于Java API规范规定了以下事实,Math.random()无法返回1.0,因此您的结果会略微偏斜:

&#34;返回带有正号的double值,大于或等于0.0且小于1.0。&#34;

答案 3 :(得分:1)

Math.random()返回[0.0,1.0]范围内的随机浮点数 - 这意味着结果可以是0到之间的任何值,但不包括 1.0。

您的代码

double rAsFloat = 1 * (2 + Math.random( ) );

将此数字设为[0.0,1.0]范围;向它添加2可以得到[2.0,3.0]范围内的数字;将它乘以1没有任何用处;然后,当您将其截断为整数时,结果始终为2.

要从这种随机函数中获取整数,您需要确定可以返回多少个不同的整数,然后将随机数乘以该整数。如果你想要&#34; 0或1&#34;回答,你的范围是2个不同的整数,所以将Math.random()乘以2:

double rAsFloat = 2 * Math.random();

这将为您提供[0.0,2.0]范围内的随机数,当您截断为(int)的整数时,该数字可以为0或1。例如,如果你想要一些返回1或2的东西,你只需要加1:

double rAsFloat = 1 + 2 * Math.random();

我认为你已经发现Random课程可以让你更轻松地获得你想要的东西。我决定无论如何都要解释这一切,因为有一天你可能会使用某种旧语言处理旧系统,而你确实需要使用[0.0,1.0]随机值。 (好吧,也许这不太可能了,但是谁知道。)

答案 4 :(得分:1)

(int)(Math.random()* 2)在这种情况下也可以正常工作

答案 5 :(得分:0)

问题可以转换为布尔生成,如下所示:

public static byte get0Or1 {

Random random = new Random();
boolean res=   random.nextBoolean();

if(res)return 1;
else return 0;

}

答案 6 :(得分:0)

没有人对随机数使用模除法。 这是您可以获得的最简单的实现:

Random rand = new Random();
int randomValue = rand.nextInt() % 2;

答案 7 :(得分:0)

Math.round(Math.random())将返回0.0和1.0。由于这两个值都在int范围的限制内,因此可以将其强制转换为int。

public static int coinToss(){
    return (int)Math.round(Math.random());
}

答案 8 :(得分:0)

这是我不使用java.util.Random的最简单方法。

Blockquote

Scanner input = new Scanner (System.in);

System.out.println("Please enter 0 for heads or 1 for tails");

int integer = input.nextInt();

input.close();

int random = (int) (Math.random() + 0.5);

if (random == integer) {
    System.out.println("correct");
}
else {
    System.out.println("incorrect");
}
System.out.println(random);

这将需要从(0到.99)之间随机加倍,并加上.5使其变为(.5到1.49)。它还会将其强制转换为一个int值(0到1)。最后一行用于测试。

答案 9 :(得分:0)

另一个变体

right_table

docs中所述,它将返回介于0(含)和指定值(不含)之间的随机int值

答案 10 :(得分:-1)

 for(int i=0;i<100;i++){
System.out.println(((int)(i*Math.random())%2)); 
    }

使用mod它会帮助你!