Я ожидал, что следующий код заполнит список "outputList" некоторыми массивами случайных целых чисел. Оказывается, это не так. Каждый массив в списке «outputList» имел одинаковые номера, когда я выводил список на консоль.
Любые идеи, почему этот список заполнен одними и теми же массивами?
Случайные значения просто показывают, что результат всегда одинаков. Я знаю, что есть несколько лучших способов заполнить список случайными значениями.
List<int[]> outputList = new();
private static void Main()
{
Program program = new();
program.StartTest(); //start non-static StartTest()-method
}
private void StartTest()
{
int[] inputArray = new int[3]; //create array {0, 0, 0}
Test(inputArray, 10); //call Test()-method, repeat 10 times
for(int i = 0; i < outputList.Count; i++) //finally print the "outputList"
{
string outputStr = string.Join(" ", outputList[i]);
Console.WriteLine(outputStr);
}
Console.ReadLine();
}
private void Test(int[] array, int n)
{
outputList.Add(array); //add the array to the outputList
//fill array with random integers
Random rand = new();
for(int i = 0; i < array.Length; i++)
array[i] = rand.Next(0, 1000);
//call function again, if n > 0
n--;
if (n > 0)
Test(array, n);
}
Ожидаемый результат
23 432 437
43 645 902
342 548 132
... (случайные значения)
Фактический результат
252 612 761
252 612 761
252 612 761
... (всегда одни и те же значения)
Я новичок здесь, в stackoverflow, поэтому, пожалуйста, простите меня за любые нубские ошибки, которые я мог сделать.
РЕДАКТИРОВАТЬ Мне нужны значения из массива для следующей итерации
Предположительно, просто полностью удалите массив, переданный методу Test
, и создайте новый в Test
. Тест не использует содержимое переданного ему массива.
просто Линк это: var rnd = new Random(); var outputList = Enumerable.Range(0,10).Select(_ => Enumerable.Range(0,3).Select(_ => rnd.Next(0,1000)).ToArray()).ToList();
Проблема в том, что вы передаете ссылку на один и тот же массив в каждой итерации метода Test. Когда вы изменяете массив внутри метода, изменения отражаются во всех ссылках на один и тот же массив.
Вместо этого вы должны создавать новый массив для каждой итерации. Также неэффективно заполнять случайный индекс на каждой итерации, потому что вы можете устанавливать значения в одних индексах много раз, а другие индексы никогда не будут установлены.
private void Test(int arraySize, int iterationsCount)
{
var arr = new int[arraySize];
outputList.Add(arr);
Random rand = new();
for(int i = 0; i < arraySize; i++)
arr[i] = rand.Next(0, 1000);
n--;
if (n > 0)
Test(arraySize, iterationsCount);
}
Теоретический момент. Коллекция ссылочных типов не хранит объекты этих типов. Он хранит только ссылки на эти объекты. Поэтому возможно, что 10 значений списка содержат одинаковые reference - адрес единственного созданного массива. И доступ к любому индекс списка будет доступом к тому же объекту одним и тем же ссылка.
спасибо, теперь я изменил "array[rand.Next(0, array.Length)]" на "array[i]" в цикле for, я думал, что уже сделал это :) Но главная проблема в том, что я нужны значения массива на следующей итерации
Есть несколько проблем с вашим кодом.
Test
и создать ее там: void StartTest()
{
Test(3 , 10); //call Test()-method, repeat 10 times
// ...
}
void Test(int arrLength, int iterations)
{
var array = new int[arrLength];
outputList.Add(array); //add the array to the outputList
//...
//call function again, if iterations > 0
iterations--;
if (iterations > 0)
Test(arrLength, iterations);
}
Читать далее:
for(int i = 0; i < array.Length; i++)
array[rand.Next(0, array.Length)] = rand.Next(0, 1000);
не в полной мере соответствует желаемой задаче по генерации "массива случайных целых чисел". Он заполнит некоторые случайные индексы массива, не обязательно все из них, что «работает», когда используется один и тот же массив, но может привести к большому количеству нулей, когда массивы создаются заново для каждой итерации. Лучше поменять на:
for(int i = 0; i < array.Length; i++)
array[i] = rand.Next(0, 1000);
P.S.
Также я бы переключился с рекурсивного подхода для Test
на простой итеративный.
спасибо, изменил индекс массива на i, не знаю, что я подумал, когда вставил туда случайный индекс
Вы всегда добавляете один и тот же массив в список. Таким образом, изменения в массиве видны по всем ссылкам в списке. Вам нужно создать копию массива в точке. Возможно, ваш рекурсивный вызов
Test
должен скопировать.