Гость
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Вопрос про shuffle / 11 сообщений из 11, страница 1 из 1
06.06.2020, 22:46
    #39966793
ferzmikk
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вопрос про shuffle
Здравствуйте!

Пишу вариант 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
06.06.2020, 23:09
    #39966794
Shocker.Pro
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вопрос про shuffle
Можно перемешивать не сами массивы, а индексы массивов.

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

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

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

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

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

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

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

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


Лучше от этого абстрагироваться )
Весь массив, который нужно сделать shuffle может даже быть не в памяти
...
Рейтинг: 0 / 0
09.06.2020, 14:47
    #39967422
ferzmikk
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вопрос про shuffle
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
09.06.2020, 15:03
    #39967426
Shocker.Pro
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вопрос про shuffle
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
09.06.2020, 17:03
    #39967488
ferzmikk
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вопрос про shuffle
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
09.06.2020, 17:18
    #39967493
Shocker.Pro
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вопрос про shuffle
ferzmikk
Что то сложно у меня получается
потому что это про разное.
Zip - для склейки, а перемешивание - это отдельная тема
...
Рейтинг: 0 / 0
09.06.2020, 18:27
    #39967513
ferzmikk
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вопрос про shuffle
А вот такой дополнительный вопрос, если усложнить задачу: есть два таких же массива, но первый массив двумерный. В первом массиве нулевое измерение равно нулевому измерению второго массива. И вот соединяю пока без перемешки.
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
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Вопрос про shuffle / 11 сообщений из 11, страница 1 из 1
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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