如何 "erase" 数字只有数字的第一位
How to "erase" numbers to only have the first digit of the number
如果我的变量是一个介于 0 和 6294 之间的随机数,我如何让我的输出只打印出第一个变量?
我的随机数代码是
int random = (int)(Math.random() * 6294);
例如,如果它吐出 3542,我希望它只说 3。如果它吐出 865,我希望它说 8。我对 Java 不太熟悉,但我在想它与行间距有关吗?与 %d、%f、%s 的命令有关?我不确定所以任何见解将不胜感激!
编辑**
没有它是我的教授发布的学习指南的一部分。这就是为什么它是 0-6294 之间的数字。我只是不知道如果数字不断变化,我该如何计算。
我认为最简单的解决方案是将数字视为 String
,并仅检索第一个字符。
然后你就可以安全地将它转换回数字了。
例如
// assuming the output
int random = 3542;
// getting 1st character only
String truncated = String.valueOf(random).substring(0,1);
// parsing new int
int newRandom = Integer.parseInt(truncated); // ==> 3
备注
如果您只想要第一个数字,您很可能不需要像目前那样随机化。
正如@Berger 所说,只生成 1 到 10 之间的随机数会更容易:
Random r = new Random();
int random = r.nextInt(10) + 1
有很多方法可以做到。我比较喜欢的是除数只要大于9即可:
int first_digit(int n) {
while (Math.abs(n) > 9) {
n /= 10;
}
return n;
}
你可以做一些基本的数学运算。以 10 为底数的对数给出了该数字的位数。将一个数除以 10 的位数减一的幂会将小数点向左移动:
int first_digit_v2(int x) {
return x / (int)Math.pow(10, (int)Math.log10(x));
}
直接在 1 到 9 之间随机输入一个数字可能更容易,但概率分布与取数字的第一位不同。这是因为 Benford's law.
为什么要走那么多弯路?为什么要创建一个 4 位数字;当你只关心第一个时?!
你看,本质上是求一个0到6之间的随机数呢。
(或者,按照您的想法使用 865 中的 8;0 和 9)。
然后去 Random.nextInt(),比如:
int randomValueBetween0And9 = new Random().nextInt(7);
提示:正如 JimmyB 在这里正确指出的那样:您在这里所做的事情会影响值的分布。另一方面:当您将示例输入放在一起时,您是否考虑过 分布?
而不是截断只生成你需要的...
0 到 9 之间的整数
int random = (int)(Math.random() * 10);
假设有一个很好的理由来截断而不只是生成一个较小的随机数(正如其他人所建议的那样),您可以将 int 解析为一个字符串并使用以下内容获得第一个 char/digit:
//get random number
int random = (int)(Math.random() * 6294);
//print out just the first digit
System.out.println(String.valueOf(random).charAt(0));
与 Mena 的回答相同,但使用 charAt(0)
而不是 substring(0,1)
如果我的变量是一个介于 0 和 6294 之间的随机数,我如何让我的输出只打印出第一个变量?
我的随机数代码是
int random = (int)(Math.random() * 6294);
例如,如果它吐出 3542,我希望它只说 3。如果它吐出 865,我希望它说 8。我对 Java 不太熟悉,但我在想它与行间距有关吗?与 %d、%f、%s 的命令有关?我不确定所以任何见解将不胜感激!
编辑** 没有它是我的教授发布的学习指南的一部分。这就是为什么它是 0-6294 之间的数字。我只是不知道如果数字不断变化,我该如何计算。
我认为最简单的解决方案是将数字视为 String
,并仅检索第一个字符。
然后你就可以安全地将它转换回数字了。
例如
// assuming the output
int random = 3542;
// getting 1st character only
String truncated = String.valueOf(random).substring(0,1);
// parsing new int
int newRandom = Integer.parseInt(truncated); // ==> 3
备注
如果您只想要第一个数字,您很可能不需要像目前那样随机化。
正如@Berger 所说,只生成 1 到 10 之间的随机数会更容易:
Random r = new Random();
int random = r.nextInt(10) + 1
有很多方法可以做到。我比较喜欢的是除数只要大于9即可:
int first_digit(int n) {
while (Math.abs(n) > 9) {
n /= 10;
}
return n;
}
你可以做一些基本的数学运算。以 10 为底数的对数给出了该数字的位数。将一个数除以 10 的位数减一的幂会将小数点向左移动:
int first_digit_v2(int x) {
return x / (int)Math.pow(10, (int)Math.log10(x));
}
直接在 1 到 9 之间随机输入一个数字可能更容易,但概率分布与取数字的第一位不同。这是因为 Benford's law.
为什么要走那么多弯路?为什么要创建一个 4 位数字;当你只关心第一个时?!
你看,本质上是求一个0到6之间的随机数呢。 (或者,按照您的想法使用 865 中的 8;0 和 9)。
然后去 Random.nextInt(),比如:
int randomValueBetween0And9 = new Random().nextInt(7);
提示:正如 JimmyB 在这里正确指出的那样:您在这里所做的事情会影响值的分布。另一方面:当您将示例输入放在一起时,您是否考虑过 分布?
而不是截断只生成你需要的... 0 到 9 之间的整数
int random = (int)(Math.random() * 10);
假设有一个很好的理由来截断而不只是生成一个较小的随机数(正如其他人所建议的那样),您可以将 int 解析为一个字符串并使用以下内容获得第一个 char/digit:
//get random number
int random = (int)(Math.random() * 6294);
//print out just the first digit
System.out.println(String.valueOf(random).charAt(0));
与 Mena 的回答相同,但使用 charAt(0)
而不是 substring(0,1)