如何使用带有String的Math.random()

时间:2017-11-06 02:10:24

标签: java

我正在尝试显示四面骰子的数字。数字是2,3,5和7.我使用如下所示的字符串变量来获取骰子的int值:

rdd_2.collect.foreach(println)

我收到“String index out of range”错误。

如何修复我的代码以打印出以下内容,例如:

    System.out.println("###############");
    System.out.println("#   Welcome   #");
    System.out.println("###############");


    String vals = "2357";

    int od1 = vals.charAt((int)(Math.random() * 4) - '0');
    int od2 = vals.charAt((int)(Math.random() * 4) - '0');
    int od3 = vals.charAt((int)(Math.random() * 4) - '0')


    System.out.print("\n" + "Player" + "\n");
    System.out.println("-----------");
    System.out.print(od1 + " " + od2 + " " + od3);

5 个答案:

答案 0 :(得分:1)

首先,如果您希望它正常工作,请按以下方式更改您的代码:从初始值String中随机选择一个char。

    System.out.println("###############");
    System.out.println("#   Welcome   #");
    System.out.println("###############");


    String vals = "2357";

    char od1 = vals.charAt((int)(Math.random() * 4));
    char od2 = vals.charAt((int)(Math.random() * 4));
    char od3 = vals.charAt((int)(Math.random() * 4));


    System.out.print("\n" + "Player" + "\n");
    System.out.println("-----------");
    System.out.print(od1 + " " + od2 + " " + od3);

但是,您可以直接使用Random.nextInt()代替当前的实施:

  

public int nextInt(int bound)

     

统一返回伪随机数   在0(包括)和指定值之间分配int值   (独占的),从这个随机数生成器的序列中提取。该   nextInt的一般契约是指定的一个int值   范围是伪随机生成并返回的。所有绑定可能int   以(近似)相等的概率产生值。方法   nextInt(int bound)由Random类实现,如下所示:

 public int nextInt(int bound) {
   if (bound <= 0)
     throw new IllegalArgumentException("bound must be positive");

   if ((bound & -bound) == bound)  // i.e., bound is a power of 2
     return (int)((bound * (long)next(31)) >> 31);

   int bits, val;
   do {
       bits = next(31);
       val = bits % bound;
   } while (bits - val + (bound-1) < 0);
   return val;
 }
  

对冲&#34;大约&#34;仅在前面的描述中使用   因为下一个方法只是一个无偏见的来源   独立选择的位。如果它是随机的完美来源   选择的位,然后显示的算法将从中选择int值   所述范围具有完美的均匀性。

     

算法有点棘手。它拒绝可能产生的价值   在不均匀的分布中(由于2 ^ 31不可分割的事实)   由n)。值被拒绝的概率取决于n。该   最坏的情况是n = 2 ^ 30 + 1,拒绝的概率是1/2,   并且循环终止前的预期迭代次数为2。

     

该算法特别针对n为2的幂的情况:it   从底层返回正确数量的高位   伪随机数发生器。在没有特殊待遇的情况下   将返回正确数量的低位。线性   同余的伪随机数生成器,如一个   众所周知,这个类实现了短期   它们的低位比特的值序列。因此,这种特殊情况   大大增加了返回的值序列的长度   如果n是2的小幂,则连续调用此方法。

     

参数:bound - 上限(不包括)。必须是积极的。   返回:下一个伪随机,均匀分布的int值   从该随机数到零(包括)和绑定(不包括)之间   生成器的序列抛出:IllegalArgumentException - 如果绑定的话   不积极因为:   1.2

答案 1 :(得分:1)

你可以这样做:

String vals = "2357";
Random random = new Random();
int index = random.nextInt(vals.length());
int od3 = vals.charAt(index);

进一步了解为何使用Random.nextInt()代替Math.random()Stackoverflow: Math.random() versus Random.nextInt(int)

答案 2 :(得分:0)

正如其他正确的答案所指出的,有更好的方法来写这个。但是,如果您正确地编写了它,那么您的方法将起作用。

int od2 = vals.charAt((int)(Math.random() * 4) - '0');

看起来您正在尝试从字符串中检索其中一个字符,即'2''3''5''7',然后减去'0'从中得到整数2,3,5或7.这是进行此转换的正常方法。 (Character.digit()稍微好一点,因为Unicode中有其他字符可以解释为数字,但这里没关系。另外,如果你所做的只是打印输出,那么你就不会需要进行转换 - 只需打印char。但这取决于你,因为我不知道你是否打算在其他地方使用整数值。)

您的错误是您将- '0' 置于charsAt电话中。因此,您生成一个从0到3的随机数,减去48,然后然后将结果用作字符串的索引。当然,结果是IndexOutOfBoundsException。您需要做的就是将- '0'放在正确的位置:

int od2 = vals.charAt((int)(Math.random() * 4)) - '0';

答案 3 :(得分:0)

从&#39; 0&#39;中减去char,而不是int。 试试这个:

  int od1 = vals.charAt((int)(Math.random() * 4)) - '0';

答案 4 :(得分:-1)

&#39; 0&#39;存在问题。您可以使用它从数字中减去0的ASCII值,这样您就不需要知道任何ASCII数字。但是你要从int数中减去它。 试试这个

int od1 = vals.charAt((int)(Math.random() * 4)) - '0';