kotlin - 使用 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 是否有可能不返回它已经返回的值?当然,我可以在检查重复项时做一些逻辑,但我真的认为应该有更优雅的东西
解决方案
如果您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)
}
推荐阅读
- spring-boot - Spring boot for Micrometer registers filter in nested Prometheus registry not Global,在度量创建期间被忽略?
- angular - Angular:如何访问嵌套表单中控件的值
- machine-learning - 如何使用 TfidfVectorizer 应用 Kfold?
- python - 在 Python 中绘制之前向下采样一个 numpy 向量
- spring-boot - JAXBSring 和普通字符串
- java - 找不到 Gradle DSL 方法:'destination()'
- azure - Azure SFTP 文件传输到 Blob 存储
- perl - pp - PAR 打包程序,找不到 strict.pm
- java - 如何在 Java Struts2 中进行下一个和上一个链接
- javascript - 将文件上传到远程文件服务器 (PHP)