2零件问题
第一部分 - 我想请用户提供一个数字,然后创建一个数组,该数组的位置与介绍的数字一样多,我该怎么做?
第二部分 - 数组将被随机数填充,但i 不需要重复的数字。这是我的代码,它继续注册重复数字
var A = intArrayOf(0,0,0,0,0,0)
for (i in 0..A.size - 1) {
val rnd = (0..10).random()
for (j in 0..A.size-1) {
if (rnd == A[j]){
break
}
else{
A[i] = rnd
break
}
}
}
我在做什么错?
要记住的一件事是,如果您试图在一个范围内生成随机数,但没有重复,则需要确保至少是随机数的范围等于目标阵列的大小。
例如,如果您试图生成一个尺寸12的数组,范围为0..10,则无法完成,因为只有11个可能性。
取决于您的要求(范围仅0到数组的大小?)如果数字的空间很小,则可以通过从rangeStart..rangeEnd
中调整列表来简化这一点:
/**
* Generates an array of unique random numbers between zero and the larger of
* arraySize or upperBound. If upperBound is not specified, it defaults to be
* arraySize.
*
* @param arraySize the size of the returned integer array
* @param upperBound an optional upper bound for the range of random numbers
*/
fun generateArray(arraySize: Int, upperBound: Int = size): IntArray {
return (0..Math.max(upperBound, arraySize)).shuffled().take(arraySize).toIntArray()
}
这还避免了浪费的废弃重复随机数,并确保函数调用需要确定的时间来执行。
您可以向用户询问此类数组的项目数:
var n = 0
println("Number of items in the array = ")
try {
n = readLine()!!.toInt()
} catch (e: Exception) {
}
现在,如果n
是一个正整数,则将初始化数组,然后填充随机的非重复整数编号:
if (n > 0) {
val array = IntArray(n) // initialize an array of n items all being 0
val r = Random() // create a random numbers generator
array.indices.forEach {
var newInt = 0
while (array.contains(newInt)) { newInt = r.nextInt() }
array[it] = newInt
}
array.forEach { print("$it ") }
}
使用contains()
,您可以检查数组中的新生成的随机数是否已经存在(这意味着数组将填充非零整数)。
如果您希望随机数在特定范围内,那么而不是:
newInt = r.nextInt()
使用:
newInt = r.nextInt((upperBound + 1) - lowerBound) + lowerBound
或Kotlin版本1.3 :
newInt = (lowerBound..upperBound).random()