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

Android随机数序列重复问题求助:无需重启APP生成不同序列

Android随机数生成问题:每次加载页面生成不同序列失败

在Android开发中,我需要每次加载页面时生成20个1到905之间的随机数,但遇到了以下问题:

  • 使用Kotlin Random时,即使关闭并重新打开APP,仍会生成相同的随机数序列;
  • Java Random和SecureRandom仅在关闭并重启APP时才会生成不同序列,无法实现无需重启APP,每次加载页面都生成不同序列的需求。

我尝试了多种解决方案,但结果都一致,希望有人能帮忙排查问题所在。

尝试过的解决方案

  1. 直接创建Random实例生成随机数列表
val randomIndex: List<Int> = List(20){
    java.util.Random().nextInt(905) + 1
}
  1. 使用Set去重生成随机数(结合remember)
val randomIndex: MutableSet<Int> = remember{ mutableSetOf() }

while (randomIndex.size < 20){
    randomIndex.add(java.util.Random().nextInt(905) + 1)
}
  1. 通过shuffled方法打乱序列截取随机数
val randomIndex: List<Int> = (0..905).toList().shuffled(Random).subList(0,20)

注:我使用Jetpack Compose和Kotlin开发,可忽略mutable state和remember相关代码。所有出现Random的地方,我都试过Java Random、SecureRandom以及Kotlin Random,问题依旧。我还尝试在第二个方案的循环外初始化Random,结果还是一样。

补充环境信息

  • Kotlin版本:1.6.10
  • Android编译SDK版本:33
  • 测试设备:Android 8、Android 11

后续尝试(编辑2)

按照建议将生成逻辑迁移到ViewModel中,两种写法都试过,但问题仍未解决:

写法1

var pokemonIndex: List<Int> = mutableStateListOf()

init {
    pokemonIndex = List(20){
        java.util.Random().nextInt(905)+1
    }
}

Composable中调用代码:

val viewModel: PokemonGameViewModel = hiltViewModel()
val randomIndex = viewModel.pokemonIndex

写法2

val pokemonIndex: MutableState<List<Int>>
get() = mutableStateOf(
    List(20){
        java.util.Random().nextInt(905)+1
    }
)

内容的提问来源于stack exchange,提问作者Nima Khajehpour

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.08 18:20:33