使用 SecureRandom 生成唯一的随机值

Generating unique random values with 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 是否有可能不 return 它已经 return 的值? 当然我可以在检查重复项的地方做一些逻辑,但我真的认为应该有更优雅的东西

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


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

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

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