我正在尝试生成一些数字,以使差异始终为正。用户输入数字和所需的行数。例如3位3行将产生
971
888
121
我想确保两者之间的差异始终是积极的。有什么我可以使用的算法。现在我只是让我的程序创建数字,然后减去它们,如果结果是负数,它将再次执行...非常慢。
我正在考虑先产生差异,然后将其相加直到达到所需的行数。但是如果我生成大量数字,就会遇到问题。
这是我用来生成具有X位数字的随机数的代码,以防万一。
private fun createRandomNumber(digits: Int): Int {
val numberArray = IntArray(digits)
for (number in 0 until numberArray.size){
numberArray[number] = 9
}
val maxnumber:Int = numberArray.joinToString("").toInt()
numberArray[0] = 1
for (number in 1 until numberArray.size){
numberArray[number] = 0
}
val minnumber:Int = numberArray.joinToString("").toInt()
return (minnumber..maxnumber).random()
}
根据杰夫·鲍曼(Jeff Bowman)的建议,我首先对包含所有生成数字的数组进行排序,然后将所有内容加速到可接受的数量!
答案 0 :(得分:2)
即使@forpas解决方案很好,由于最终排序,它仍然可以在O(n log n)
中运行。我的解决方案只是生成递增的间隔,在其中生成随机数(用于均匀性分布),然后将每个间隔map
设为该范围内的随机数,从而避免了对最终列表进行排序的需要。复杂度为O(n)
我选择使用Stream
以避免突变或显式递归,但这不是强制性的。
示例
fun main(args: Array<String>) {
val count = 20L
val digits = 5
val min = pow(10.0, digits.toDouble() - 1).toLong()
val max = min*10 - 1
val gap = (max - min)/count + 1
val numbers =
Stream.iterate(Pair(min, min + gap)) { (_, prev) -> Pair(prev, prev + gap) }
.map { (start, end) -> Random.nextLong(start, end) }
.limit(count)
.collect(Collectors.toList())
numbers.forEach(::println)
}
输出
11298
16284
20841
26084
31960
35538
37208
45325
46970
52918
57514
59769
67689
70135
75338
78075
84561
86652
91938
99931
答案 1 :(得分:1)
我将使用此函数来创建一个具有一定位数的随机数:
fun createRandomNumber(digits: Int) = (10f.pow(digits - 1).toInt() until 10f.pow(digits).toInt()).shuffled().first()
您将需要此导入:
import kotlin.math.pow
然后加上这个:
fun main(args: Array<String>) {
print("how many numbers?: ")
val numbers = readLine()!!.toInt()
print("how many digits?: ")
val digits = readLine()!!.toInt()
val set = mutableSetOf<Int>()
do {
set.add(createRandomNumber(digits))
} while (set.size < numbers)
val array = set.toTypedArray().sortedArrayDescending()
array.forEach { println(it) }
}
您将获得用户的输入并创建一组随机数。
使用toTypedArray().sortedArrayDescending()
,您可以获得数组。