我正在尝试显示四面骰子的数字。数字是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);
答案 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';