[英]How to generate different random number by scala? and the number should be as short as possible
[英]How to generate 15 digit random number using Scala
我是 Scala 编程的新手,我想生成 15 位的随机数,所以请你分享一些例子。 我尝试了以下代码来获取 10 位的字母数字字符串。
var ranstr = s"${(Random.alphanumeric take 10).mkString}"
print("ranstr", ranstr)
您需要注意返回类型。 您不能有 15 位Int
,因为该类型是 32 位带符号的 integer,这意味着它的最大值略高于 2B。 即使获得一个 10 位数字也意味着您最多只能获得一个介于 1B 和Int
最大值之间的数字。
其他答案 go 详细介绍了如何使用Long
获取 15 位数字。 在您提到的评论between
,但由于我之前提到的限制,使用Int
s 将不允许您 go 超出示例中的 9 位数字。 但是,您可以使用尾随L
显式注释您的数字文字,以使其为Long
并实现您想要的内容,如下所示:
Random.between(100000000000000L, 1000000000000000L)
请注意, between
的文档说最后一个数字是排他的。
如果您对生成任意大的数字感兴趣, String
可能会完成这项工作,如下例所示:
import scala.util.Random
import scala.collection.View
def nonZeroDigit: Char = Random.between(49, 58).toChar
def digit: Char = Random.between(48, 58).toChar
def randomNumber(length: Int): String = {
require(length > 0, "length must be strictly positive")
val digits = View(nonZeroDigit) ++ View.fill(length - 1)(digit)
digits.mkString
}
randomNumber(length = 1)
randomNumber(length = 10)
randomNumber(length = 15)
randomNumber(length = 40)
请注意,将Int
转换为Char
时,您得到的是由该数字编码的字符,它不一定与Int
本身表示的数字相同。 您在ASCII 表中的函数中看到的数字(很可能对于您想要做的事情来说已经足够好了)。
如果您确实需要数字类型,对于任意大的整数,您将需要使用BigInt
。 它的构造函数之一允许您从字符串中解析数字,因此您可以重用上面的代码,如下所示:
import scala.math.BigInt
BigInt(randomNumber(length = 15))
BigInt(randomNumber(length = 40))
您可以在 Scastie 上使用此代码。
请注意,在我的示例中,为了简单起见,我强制随机数的第一个数字不为零。 这意味着数字 0 本身永远不会是可能的 output。 如果您希望在要求 1 位长号码时出现这种情况,建议您根据需要定制示例。
与 Alin 的foldLeft
类似的方法,基于scanLeft
,其中中间随机数字首先被收集到Vector
中,然后连接为BigInt
,同时确保第一个随机数字(参见scanLeft
中的初始化值)大于零,
import scala.util.Random
import scala.math.BigInt
def randGen(n: Int): BigInt = {
val xs = (1 to n-1).scanLeft(Random.nextInt(9)+1) {
case (_,_) => Random.nextInt(10)
}
BigInt(xs.mkString)
}
要注意Random.nextInt(9)
将提供一个介于0
和8
之间的随机值,因此我们添加1
以将可能的值从1
转移到9
。 因此,
scala> (1 to 15).map(randGen(_)).foreach(println)
8
34
623
1597
28474
932674
5620336
66758916
186155185
2537294343
55233611616
338190692165
3290592067643
93234908948070
871337364826813
在 scala 中,我们有scala.util.Random
来获取随机值(不仅是数字),对于数值随机有nextInt(n: Int)
返回随机 num < n。 阅读更多关于随机
第一个例子:
val random = new Random()
val digits = "0123456789".split("")
var result = ""
for (_ <- 0 until 15) {
val randomIndex = random.nextInt(digits.length)
result += digits(randomIndex)
}
println(result)
这里我创建了一个 random 的实例,并使用一个从 0 到 9 的数字来生成一个长度为 15 的随机数
第二个例子:
val result2 = for (_ <- 0 until 15) yield random.nextInt(10)
println(result2.mkString)
这里我使用yield关键字来获取一个从0到9的随机整数数组,并使用mkString将数组组合成一个字符串。 阅读更多关于产量的信息
有很多方法可以做到这一点。
最常见的方法是使用Random.nextInt(10)
生成 0-9 之间的数字。 在构建固定大小的数字时,必须确保第一个数字永远不会为 0。
为此,我将使用Random.nextInt(9) + 1
来保证生成 1-9 之间的数字和具有其他 14 个生成数字的序列,并使用第一个数字作为累加器的foldleft
操作来生成数字:
val number =
Range(1, 15).map(_ => Random.nextInt(10)).foldLeft[Long](Random.nextInt(9) + 1) {
(acc, cur_digit) => acc * 10 + cur_digit
}
通常对于如此大的数字,最好将它们表示为字符序列而不是数字,因为数字很容易溢出。 但是由于一个 15 位数字适合Long
并且您要求一个数字,所以我使用了一个。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.