我正在生成一个随机的数字6-10位密码.我需要你的一些重要评论。可以吗?还是需要修改一下?
val AB = "0123456789669900"
val rnd = new Random()
def randomNumericalString(): String = {
val len = rnd.nextInt(5) + 5
val sb = new StringBuilder(len)
for (i <- 0 to len)
sb.append(AB.charAt(rnd.nextInt(AB.length())))
return sb.toString
}发布于 2014-06-24 10:41:26
您的算法使得某些数字的概率比其他数字高得多。这是故意的吗?例如,0的出现频率是1的3倍,最好是输入字符串"0123456789",并且具有统一的分布。
您在for -循环中提供的范围是令人困惑的,要求为6位数,但是,您使用魔术数字5。在随机。考虑使用:
val shortest = 6
val longest = 10
val len = shortest + rnd.nextInt(longest - shortest + 1)
for (i <- 1 to len)这是一个足够的答案,它本身,但我建议你考虑以下几点。它有一点缺陷,因为它从不生成一个以0作为第一个字符的值.当我意识到这一点的时候,我已经回答了这个问题,但我认为你还是应该考虑一下这个方法:
def randomNumericalString(): String = {
return ((100000.0 + rnd.nextDouble() * (10000000000.0 - 100000.0)).toLong).toString
}以上将产生一个分布均匀的随机数,介于100000到9999999999 (和在这里,作为一个理想 )之间。
发布于 2014-06-25 02:22:05
例如,如果需要使用数字键盘输入密码,我可以理解是否需要只使用数字密码。通常,只有数字的密码称为PIN,我建议使用该术语.引脚的熵小于字母数字密码,但如果系统采取措施防止暴力攻击,它们仍然是安全的。不过,我无法理解将概率偏向于数字6、9和0的愿望。我相信你也同样困惑,我不会质疑这个奇怪的要求。
一些快速观察:
AB是个奇怪的名字。digits呢?for (i <- 0 to n) …很尴尬,很可能会导致错误。编写重复n次的for -循环的逻辑方法是:for (i <- 0直到n)…。或用于(i <- 1至n)…我建议(_ <- 0直到连){ sb.append(digits.charAt(rnd.nextInt(digits.length()))) }从开始i的价值重写…
val digits = "0123456789669900"
val rnd = new Random()
def randomPIN(minLen:Int=6, maxLen:Int=10): String = {
val len = rnd.nextInt(1 + maxLen - minLen) + minLen
val sb = new StringBuilder(len)
for (_ <- 0 until len) {
sb.append(digits.charAt(rnd.nextInt(digits.length())))
}
return sb.toString
}https://codereview.stackexchange.com/questions/55098
复制相似问题