如何 "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)