随机并非混乱:Kotlin 如何解决 Stack Overflow 上的问题
\n\n每个开发者一生中至少编写过一次生成随机数的代码。看起来能有多难?但当这个问题在 Stack Overflow 上被提出(问题 "How can I get a random number in Kotlin?" 获得了数千次浏览),很明显:暗礁比看起来要多。特别是当您从 Java 或 Python 迁移过来时。
\n\n在本文中,我们将从简单到高级技术详细讲解 Kotlin 中的随机数生成。您将学习如何获取随机整数、小数、如何设置范围,甚至如何为安全目的生成加密安全的随机数。开始吧!
\n\n基础:Kotlin 中的 Random
\n\nKotlin 没有自己独立的 random 类——它使用了来自 Java 的强大 java.util.Random,但语法更加方便。得益于扩展函数,编写 Kotlin random 代码几乎可以在一行内完成。
最简单的方法:Random.nextInt()
\n\n如果您只需要一个随机整数(从 0 到 Int 的最大值),请使用:
\n\nimport kotlin.random.Random\n\nfun main() {\n val randomNumber = Random.nextInt()\n println("随机数:$randomNumber")\n}\n\n每次运行都会产生一个新值。但更常见的是我们需要限制范围。为此有一个重载版本:
\n\nval fromZeroToTen = Random.nextInt(10) // 0..9\nval fromFiveToFifteen = Random.nextInt(5, 15) // 5..14\n\n重要提示: 在 Kotlin 中,与 Java 一样,上限 不包含。Random.nextInt(10) 将返回 0 到 9 之间的数字。\n\n小数:Random.nextDouble() 和 Random.nextFloat()
\n\n要生成 Kotlin 中的随机 float 或 double,请使用:
\n\nval randomDouble = Random.nextDouble() // 0.0..1.0\nval randomFloat = Random.nextFloat() // 0.0..1.0\n\n// 带范围:\nval doubleInRange = Random.nextDouble(10.0, 20.0) // 10.0..20.0\n\n请注意:nextFloat() 不支持范围——只有 nextDouble() 支持。如果需要在范围内使用 float,请进行转换:
val customFloat = Random.nextDouble(1.5, 5.5).toFloat()\n\n在范围内生成随机数:实际示例
\n\n在实际项目中,最常见的是需要 Kotlin 中给定范围内的随机数。让我们分析最流行的场景。
\n\n从 1 到 100 的随机整数(包含)
\n\n要包含上限,只需加 1:
\n\nval diceRoll = Random.nextInt(1, 7) // 1..6(像骰子)\nval lottery = Random.nextInt(1, 101) // 1..100\n\n数组或列表的随机索引
\n\n最常见的任务之一是从集合中获取随机元素:
\n\nval colors = listOf("红色", "蓝色", "绿色", "黄色")\nval randomColor = colors[Random.nextInt(colors.size)]\nprintln("随机颜色:$randomColor")\n\n但在 Kotlin 中,还有一种更优雅的方法——random() 函数:
val randomColor = colors.random()\nprintln("随机颜色:$randomColor")\n\n在底层,它执行相同的操作,但代码变得更简洁。
\n\n带步长的随机数
\n\n有时需要生成某个值的倍数。例如,0 到 100 之间的偶数:
\n\nfun randomEven(max: Int): Int {\n val half = max / 2\n return Random.nextInt(0, half + 1) * 2\n}\n\nprintln(randomEven(100)) // 0, 2, 4, ..., 100\n\n高级技术:序列和加密安全性
\n\n随机数序列
\n\n如果需要生成随机数列表,请使用 generate