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
相关产品推荐
相关产品推荐

