首页 > 解决方案 > 使用 SecureRandom 生成唯一的随机值

问题描述

我目前正在实施一个秘密共享方案。(shamir)为了生成一些秘密共享,我需要在一个范围内生成一些随机数。为此,我有这个非常简单的代码:

val sharesPRG = SecureRandom()
fun generateShares(k :Int): List<Pair<BigDecimal,BigDecimal>> {
 val xs = IntArray(k){ i  -> sharesPRG.nextInt(5)}
 return xs
 }

我省略了实际创建共享作为坐标的部分,只是为了使其可复制,并选择了一个任意小的 5。我的问题是我当然需要这些共享是唯一的,拥有共享没有意义那是一样的。那么 Securerandom.nextint 是否有可能不返回它已经返回的值?当然,我可以在检查重复项时做一些逻辑,但我真的认为应该有更优雅的东西

标签: kotlinsecure-random

解决方案


如果您k不是太大,您可以继续向集合添加随机值,直到它达到 size k


fun generateMaterial(k: Int): Set<Int> = mutableSetOf<Int>().also {
    while (it.size < k) {
        it.add(sharesPRG.nextInt(50))
    }
}

然后,您可以使用该集合作为对列表的源材料(k需要是偶数):

fun main() {
    val pairList = generateMaterial(10).windowed(2, 2).map { it[0] to it[1] }
    println(pairList)
}

推荐阅读