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
}
}
}
Что я делаю неправильно?



Вы можете запросить у пользователя количество элементов массива следующим образом:
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
или для Котлин версии 1.3+:
newInt = (lowerBound..upperBound).random()
Следует помнить одну вещь: если вы пытаетесь сгенерировать случайные числа в пределах диапазона, но не имеете дубликатов, вам необходимо убедиться, что диапазон случайных чисел по крайней мере равен размеру целевого массива.
Например, если вы пытаетесь сгенерировать массив размером 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()
}
Это также позволяет избежать расточительного создания отброшенных повторяющихся случайных чисел и гарантирует, что вызов функции займет определенное количество времени для выполнения.