Android随机数序列重复问题求助:无需重启APP生成不同序列
Android随机数生成问题:每次加载页面生成不同序列失败
在Android开发中,我需要每次加载页面时生成20个1到905之间的随机数,但遇到了以下问题:
- 使用Kotlin Random时,即使关闭并重新打开APP,仍会生成相同的随机数序列;
- Java Random和SecureRandom仅在关闭并重启APP时才会生成不同序列,无法实现无需重启APP,每次加载页面都生成不同序列的需求。
我尝试了多种解决方案,但结果都一致,希望有人能帮忙排查问题所在。
尝试过的解决方案
- 直接创建Random实例生成随机数列表
val randomIndex: List<Int> = List(20){ java.util.Random().nextInt(905) + 1 }
- 使用Set去重生成随机数(结合remember)
val randomIndex: MutableSet<Int> = remember{ mutableSetOf() } while (randomIndex.size < 20){ randomIndex.add(java.util.Random().nextInt(905) + 1) }
- 通过shuffled方法打乱序列截取随机数
val randomIndex: List<Int> = (0..905).toList().shuffled(Random).subList(0,20)
注:我使用Jetpack Compose和Kotlin开发,可忽略mutable state和remember相关代码。所有出现
Random的地方,我都试过JavaRandom、SecureRandom以及KotlinRandom,问题依旧。我还尝试在第二个方案的循环外初始化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
相关产品推荐
相关产品推荐

