You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Kotlin random()方法始终生成相同"随机数"问题排查

Kotlin随机数序列在Android 12真机上固定的问题解决

问题现象

  • 从图片数组随机选图的应用,在Nexus 5X Android 5.1模拟器上运行正常,随机序列每次打开都会变化
  • 在Galaxy Note 10 Lite(Android 12)真机上,每次打开应用都会生成完全相同的随机数序列,关闭再打开、甚至卸载重装都无变化,只有重启手机才会生成新的固定序列
  • 对比测试:Java版本应用每次重启都会生成新序列,问题确认与Kotlin的随机数实现相关

原因分析

Kotlin标准库的kotlin.random.Random默认实现,在Android 12及以上版本的ART运行环境中,会复用一个固定的种子源,而非像Java的java.util.Random那样每次实例化时使用当前时间作为默认种子。这导致应用每次启动时,随机数生成器的种子不会变化,最终输出完全固定的序列。

解决方案

不要使用Kotlin默认的Random实例,通过以下方式确保每次启动时种子动态变化:

方案1:用系统时间初始化Kotlin Random

// 用当前时间戳作为种子,每次启动都会生成新种子
val random = Random(System.currentTimeMillis())
// 生成数组范围内的随机索引
val randomIndex = random.nextInt(imageArray.size)

方案2:直接使用Java的Random类

// Java的Random默认用当前时间戳初始化种子,每次启动都会不同
val random = java.util.Random()
val randomIndex = random.nextInt(imageArray.size)

方案3:使用安全随机数(适合高随机性需求场景)

如果对随机数的安全性要求较高(比如避免被预测),可以使用SecureRandom:

val secureRandom = java.security.SecureRandom()
val randomIndex = secureRandom.nextInt(imageArray.size)

验证效果

采用上述任意方案后,每次打开应用时,随机数生成器的种子都会动态更新,从而生成不同的随机数序列,解决固定序列的问题。

内容的提问来源于stack exchange,提问作者rm -rf

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.21 19:54:26