powered by simpleCommunicator - 2.0.49     © 2025 Programmizd 02
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Вопрос про shuffle
11 сообщений из 11, страница 1 из 1
Вопрос про shuffle
    #39966793
ferzmikk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Здравствуйте!

Пишу вариант shuffle для одного array.
Код: c#
1.
2.
3.
4.
5.
Random rnd = new Random();

int[] MyArray = { 1, 2, 3, 4, 5, 6, 7, 8 };

int[] MyRandomArray = MyArray.OrderBy(x => rnd.Next()).ToArray();



Если для двух array, то shuffle должно быть соответственно по строкам. Длины array совпадают.
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
Random rnd = new Random();          

int[] MyArray1 = { 1, 2, 3, 4, 5, 6, 7, 8 };            
int[] MyArray2 = { 10, 20, 30, 40, 50, 60, 70, 80 };

(int x , int y)[] MyArray3 = new (int, int)[MyArray1.Length];
            
for (int i = 0; i < MyArray1.Length; i++)            
{
    MyArray3[i].x = MyArray1[i];
    MyArray3[i].y = MyArray2[i];
}

(int x, int y)[] MyRandomArray = MyArray3.OrderBy(x => rnd.Next()).ToArray();


Оба варианта работают.

Скажите, для второго варианта возможно ли сократить запись или написать более оптимально, например, с помощью LINQ, учитывая что количество array может быть еще больше?
...
Рейтинг: 0 / 0
Вопрос про shuffle
    #39966794
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Можно перемешивать не сами массивы, а индексы массивов.

А если идти именно этим путем - ну надо просто for заменить на Select (ту перегрузку, которая с с индексом)
...
Рейтинг: 0 / 0
Вопрос про shuffle
    #39966800
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Shocker.Pro,

+1 перемешивать индексы лучше, чтобы не перемещать объекты в памяти
...
Рейтинг: 0 / 0
Вопрос про shuffle
    #39966814
fkthat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hVostt
Shocker.Pro,

+1 перемешивать индексы лучше, чтобы не перемещать объекты в памяти

Если reference type, то без разницы, ведь.
...
Рейтинг: 0 / 0
Вопрос про shuffle
    #39966818
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
fkthat
hVostt
Shocker.Pro,

+1 перемешивать индексы лучше, чтобы не перемещать объекты в памяти

Если reference type, то без разницы, ведь.
так он пытается создать еще один массив, чтобы его перемешать. и, кстати, из Value Tuple, так что это не референсы ни разу.
...
Рейтинг: 0 / 0
Вопрос про shuffle
    #39966827
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
fkthat
hVostt
Shocker.Pro,

+1 перемешивать индексы лучше, чтобы не перемещать объекты в памяти

Если reference type, то без разницы, ведь.


Лучше от этого абстрагироваться )
Весь массив, который нужно сделать shuffle может даже быть не в памяти
...
Рейтинг: 0 / 0
Вопрос про shuffle
    #39967422
ferzmikk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Shocker.Pro
Можно перемешивать не сами массивы, а индексы массивов.
Вы имеете ввиду так?
C#
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
Random rnd = new Random();           

int[] MyArray1 = { 1, 2, 3, 4, 5, 6, 7, 8 };
int[] MyArray2 = { 10, 20, 30, 40, 50, 60, 70, 80 };           

for (int i = MyArray1.Length - 1;  i >= 1; i--)
{
    int j = rnd.Next(i + 1);

   (int, int) tmp = (MyArray1[j], MyArray2[j]);
   (MyArray1[j], MyArray2[j]) = (MyArray1[i], MyArray2[i]);
   (MyArray1[i], MyArray2[i]) = tmp;
}            

(int x, int y)[] MyArray3 = new (int, int)[MyArray1.Length];

for (int i = 0; i < MyArray1.Length; i++)
{
    MyArray3[i].x = MyArray1[i];
    MyArray3[i].y = MyArray2[i];
}

Console.Read();

Или создается отдельный класс, где перемешиваются индексы?

А если идти именно этим путем - ну надо просто for заменить на Select (ту перегрузку, которая с с индексом)Не совсем понятно.
...
Рейтинг: 0 / 0
Вопрос про shuffle
    #39967426
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ferzmikk
Или создается отдельный класс, где перемешиваются индексы?
создается массив с индексами, которые перемешивается любым доступным способом, например так же, как в изначальном посте.

ferzmikk
Не совсем понятно.
Просьба была сократить запись с помощью Linq. Соответственно, это
ferzmikk
Код: c#
1.
for (int i = 0; i < MyArray1.Length; i++)            

заменяется в таком духе
Код: c#
1.
MyArray3 = MyArray1.Select((n, i) => (a1: n, a2: MyArray2[i])).ToArray()


Ну или можно применить Zip() для склейки двух последовательностей
...
Рейтинг: 0 / 0
Вопрос про shuffle
    #39967488
ferzmikk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Shocker.Pro
создается массив с индексами, которые перемешивается любым доступным способом, например так же, как в изначальном посте.
Получается так
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
Random rnd = new Random();

int[] MyArray1 = { 1, 2, 3, 4, 5, 6, 7, 8 };
int[] MyArray2 = { 10, 20, 30, 40, 50, 60, 70, 80 };
           
int[] ArrayOfIndices = Enumerable.Range(0, 8).ToArray().OrderBy(x => rnd.Next()).ToArray();

(int x, int y)[] MyArray3_1 = ArrayOfIndices.Select((element, index) =>
    (x: MyArray1[ArrayOfIndices[index]], y: MyArray2[ArrayOfIndices[index]])).ToArray();   



Ну или можно применить Zip() для склейки двух последовательностейЧто то сложно у меня получается
Код: c#
1.
2.
3.
4.
5.
(int x, int y)[] MyArray3_2 = MyArray1.Zip(MyArray2, (first, second) => 
            (
                x: MyArray1[ArrayOfIndices[Array.IndexOf(MyArray1, first)]],
                y: MyArray2[ArrayOfIndices[Array.IndexOf(MyArray2, second)]]
            )).ToArray();



Но оба варианта работают.
...
Рейтинг: 0 / 0
Вопрос про shuffle
    #39967493
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ferzmikk
Что то сложно у меня получается
потому что это про разное.
Zip - для склейки, а перемешивание - это отдельная тема
...
Рейтинг: 0 / 0
Вопрос про shuffle
    #39967513
ferzmikk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А вот такой дополнительный вопрос, если усложнить задачу: есть два таких же массива, но первый массив двумерный. В первом массиве нулевое измерение равно нулевому измерению второго массива. И вот соединяю пока без перемешки.
C#
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
class Program
    {
        static void Main(string[] args)
        {
            Random rnd = new Random();

            int[,] MyArray1 = { { 10, 20, 30 }, { 11, 21, 31 }, { 12, 22, 32 }, { 13, 23, 33 }, { 14, 24, 34 }, { 15, 25, 35 }, { 16, 26, 36 }, { 17, 27, 37 } };
            int[] MyArray2 = { 0, 1, 2, 3, 4, 5, 6, 7 };

            int[] ArrayOfIndices = Enumerable.Range(0, 8).ToArray();//.OrderBy(x => rnd.Next()).ToArray();

            //Вариант 1 - Работает.
            (int[] x, int y)[] MyArray3_1 = new (int[], int)[MyArray1.GetUpperBound(0) + 1];

            for (int i = 0; i < MyArray1.GetUpperBound(0) + 1; i++)
            {
                MyArray3_1.x = new int[MyArray1.GetUpperBound(1) + 1];

                for (int j = 0; j < MyArray1.GetUpperBound(1) + 1; j++)
                {
                    MyArray3_1[i].x[j] = MyArray1[i, j];
                }

                MyArray3_1[i].y = MyArray2[i];
            }

            //Вариант 2 - Работает.
            (int[] x, int y)[] MyArray3_2 = new (int[], int)[MyArray1.GetUpperBound(0) + 1];

            for (int i = 0; i < MyArray1.GetUpperBound(0) + 1; i++)
            {                
                MyArray3_2[i].x = Get_row(MyArray1, i);         

                MyArray3_2[i].y = MyArray2[i];
            }

            //Вариант 3 - Не работает.
            (int x[], int y)[] MyArray3_3 = ArrayOfIndices.Select((element, index) =>
                (x:  Get_row(MyArray1, index), y: MyArray2[index])).ToArray();
            

            Console.Read();
        }

        static int[] Get_row(int[,] A, int i)
        {
            int num_columns = A .GetUpperBound(1) + 1;
            int[] row = new int[num_columns];

            for (int j = 0; j < num_columns; j++)
            {
                row[j] = A[i, j];
            }

            return row;
        }
    }

Вариант 1 и 2 работают. Возможно функцию [i]Get_row можно написать короче. Но третий вариант с использованием LINQ, чтоб написать по короче, не работает. Как правильно написать?
...
Рейтинг: 0 / 0
11 сообщений из 11, страница 1 из 1
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Вопрос про shuffle
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]