Форум программистов, компьютерный форум, киберфорум
C# для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.80/5: Рейтинг темы: голосов - 5, средняя оценка - 4.80
7 / 6 / 1
Регистрация: 12.10.2021
Сообщений: 397

Списки, рандом

10.11.2023, 22:08. Показов 1167. Ответов 26
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Всем привет, у меня есть список из 16 цифр и функция которая возвращает список из этих элементов, можно ли сделать так чтобы именно они задавались рандомно, а не по порядку?
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
public List<int> CreateDefaultTableKey()
{
       return DefaultKey;
}
 
private readonly List<int> DefaultKey = new List<int>()
{
            4,
            9,
            5,
            6,
            3,
            7,
            11,
            15,
            2,
            1,
            10,
            8,
            12,
            14,
            16,
            13
};
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
10.11.2023, 22:08
Ответы с готовыми решениями:

Процентный рандом
Доброй ночи. Заинтересовался как можно сделать процентный рандом. Т.е. допустим что у нас есть массив шансов int C = { 70, 29, 1 }; ...

Рандом + Массив
Как сделать рандом массива? Допусти я создам два массива из 5 элементов: string Mlogin= new string; Mlogin = &quot;Login...

Рандом от -5 (включительно) до 31
Рандом

26
151 / 135 / 29
Регистрация: 02.07.2013
Сообщений: 969
10.11.2023, 22:24
не цифры а числа

не понял вас, вам перетасовать числа 16 штук без повторений?

Добавлено через 2 минуты
если не умничать и не оптимизировать, то сделать список из 16 элементов и доставать (с удалением) по одному элементу случайного номера и класть в другой список
0
7 / 6 / 1
Регистрация: 12.10.2021
Сообщений: 397
10.11.2023, 22:34  [ТС]
Да ,перетасовать без повторений нужно

Добавлено через 9 минут
Как это сделать? поделитесь опытом
0
Эксперт .NET
 Аватар для Wolfdp
3790 / 1767 / 371
Регистрация: 15.06.2012
Сообщений: 6,543
Записей в блоге: 3
11.11.2023, 01:55
C#
1
list.OrderBy(_ => random.Next())
1
 Аватар для Doomov
1056 / 335 / 119
Регистрация: 28.11.2020
Сообщений: 1,066
11.11.2023, 06:13
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
/// <summary>
/// Метод. Создает случайный ключ таблицы.
/// </summary>
/// <returns>Случайно перемешанный список ключей таблицы.</returns>
public List<int> CreateRandomTableKey()
{
    // Создаем копию исходного списка
    List<int> shuffledKey = new List<int> (DefaultKey); 
 
    Random random = new Random();
    int n = shuffledKey.Count; // Получаем количество элементов в списке
    
    // происходит перемешивание элементов списка, 
    // используя алгоритм тасование Фишера — Йетса
    while (n > 1) 
    {
        n--;
        int k = random.Next (n + 1);
        int value = shuffledKey [k];
        shuffledKey [k] = shuffledKey [n];
        shuffledKey [n] = value;
    }
    return shuffledKey; // Возвращаем перемешанный список
}
В проге...
C#
1
2
3
4
    var lst = DefaultKey;
    Console.WriteLine(String.Join(", ", lst));
    
    Console.WriteLine(String.Join(", ", CreateRandomTableKey()));
1
Эксперт .NET
 Аватар для Wolfdp
3790 / 1767 / 371
Регистрация: 15.06.2012
Сообщений: 6,543
Записей в блоге: 3
11.11.2023, 07:49
Doomov, немного подушню:
- почему не <T>?
- почему источник для перемешивания не передается как параметр?
- random.Next (n + 1), где n--; точно даст нормальное мат-распределение? У меня ощущение, что такая перетасовка будет иметь перекос к тому, что начальные элементы редко будут попадать в конец списка.
- чем это лучше Linq?
0
 Аватар для Doomov
1056 / 335 / 119
Регистрация: 28.11.2020
Сообщений: 1,066
11.11.2023, 08:19
Цитата Сообщение от Wolfdp Посмотреть сообщение
- чем это лучше Linq?
ничем, просто вариант
0
7 / 6 / 1
Регистрация: 12.10.2021
Сообщений: 397
11.11.2023, 08:29  [ТС]
Спасибо, все работает
0
 Аватар для Doomov
1056 / 335 / 119
Регистрация: 28.11.2020
Сообщений: 1,066
11.11.2023, 08:44
Цитата Сообщение от Wolfdp Посмотреть сообщение
почему источник для перемешивания не передается как параметр?
без проблем
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
/// <summary>
/// Метод. Создает случайный ключ таблицы.
/// </summary>
/// <returns>Случайно перемешанный список ключей таблицы.</returns>
public List<T> CreateRandomTableKey<T>(List<T> arrLst) 
    where T : INumber<T>
{
    // Создаем копию исходного списка
    List<T> shuffledKey = new List<T> (arrLst); 
 
    Random random = new Random();
    int n = shuffledKey.Count; // Получаем количество элементов в списке
    
    // происходит перемешивание элементов списка, 
    // используя алгоритм Тасование Фишера — Йетса
    while (n > 1) 
    {
        n--;
        int k = random.Next (n + 1);
        T value = shuffledKey [k];
        shuffledKey [k] = shuffledKey [n];
        shuffledKey [n] = value;
    }
    return shuffledKey; // Возвращаем перемешанный список
}
1
151 / 135 / 29
Регистрация: 02.07.2013
Сообщений: 969
11.11.2023, 11:22
Цитата Сообщение от dmitrynikolaev3 Посмотреть сообщение
Спасибо, все работает
вы хоть поняли как работает? если хоть немного изменить задание справитесь?

допустим надо буде перемешать с повторением - как измените код?

Добавлено через 2 минуты
линк хорош чтобыы большой код ужать, но если вы не понимаете какой именно код вы ужимаете и используете линк как магию, то это не позволит его нормально использовать. так что хотябу надо стать крепким новичком перед его использованием даже в простых случаях.
0
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16140 / 11264 / 2888
Регистрация: 21.04.2018
Сообщений: 33,109
Записей в блоге: 2
11.11.2023, 12:12
Цитата Сообщение от Doomov Посмотреть сообщение
where T : INumber<T>
Не лишнее?

Добавлено через 1 минуту
Цитата Сообщение от Doomov Посмотреть сообщение
Random random = new Random();
Лучше сделать статическим readonly полем.

Добавлено через 3 минуты
Цитата Сообщение от Doomov Посмотреть сообщение
List<T> arrLst
Лучше по интерфейсу IList<T>.
2
11.11.2023, 12:14

Не по теме:

Цитата Сообщение от Элд Хасп Посмотреть сообщение
Лучше сделать статическим readonly полем.
Начиная с NET Core 2.0 необязательно уже т.к. new Random() использует случайное число в качестве затравки. То есть такой код уже не будет давать повторений:
C#
1
2
3
4
for (int i = 0; i < 100; i++)
{
    Console.WriteLine(new Random().Next(1, 100));
}

0
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16140 / 11264 / 2888
Регистрация: 21.04.2018
Сообщений: 33,109
Записей в блоге: 2
11.11.2023, 12:22
Цитата Сообщение от OwenGlendower Посмотреть сообщение
Начиная с NET Core 2.0 необязательно уже т.к. new Random() использует случайное число в качестве затравки. То есть такой код уже не будет давать повторений:
Согласен.
Но дело не только в повторениях.
Каждый раз при вызове метода создавать новый экземпляр Random тоже не стоит.
1
Администратор
Эксперт .NET
 Аватар для OwenGlendower
18298 / 14222 / 5368
Регистрация: 17.03.2014
Сообщений: 28,898
Записей в блоге: 1
11.11.2023, 12:24
И, кстати, в .NET 8 добавили родной Shuffle - Random.Shuffle.

Добавлено через 34 секунды
Цитата Сообщение от Элд Хасп Посмотреть сообщение
Каждый раз при вызове метода создавать новый экземпляр Random тоже не стоит.
Random.Shared в помощь
3
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16140 / 11264 / 2888
Регистрация: 21.04.2018
Сообщений: 33,109
Записей в блоге: 2
11.11.2023, 12:28
Цитата Сообщение от OwenGlendower Посмотреть сообщение
Random.Shared в помощь
0
 Аватар для Doomov
1056 / 335 / 119
Регистрация: 28.11.2020
Сообщений: 1,066
11.11.2023, 13:14
Элд Хаспвот вариант в виде расширения...
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
public static class Extension
{
    readonly static Random rng = new Random();
    
    public static List<T> Shuffle<T>(this IList<T> list)
    { 
        int n = list.Count;  
        while (n > 1) {  
            n--;  
            int k = rng.Next(n + 1);  
            T value = list[k];  
            list[k] = list[n];  
            list[n] = value;  
        } 
        return list.ToList();
    }
}
В проге...
C#
1
2
3
    var lst = DefaultKey;
    Console.WriteLine(String.Join(", ", lst));
    Console.WriteLine(String.Join(", ", lst.Shuffle ()));
Добавлено через 2 минуты
Цитата Сообщение от OwenGlendower Посмотреть сообщение
Random.Shared в помощ
...
.NET8
C#
1
2
3
4
    int[] lst = [ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 ];
    Console.WriteLine(String.Join(", ", lst));
    rnd.Shuffle(lst);
    Console.WriteLine(String.Join(", ", lst));
0
Администратор
Эксперт .NET
 Аватар для OwenGlendower
18298 / 14222 / 5368
Регистрация: 17.03.2014
Сообщений: 28,898
Записей в блоге: 1
11.11.2023, 13:14
Цитата Сообщение от Doomov Посмотреть сообщение
Просьба показать вариант применения в данном примере, а то сообразить не могу
Я самый простой пример приведу. Далее вы уже справитесь.
C#
1
2
3
4
using System.Runtime.InteropServices;
 
List<int> list = [1,2,3,4,5,6,7,8,9,10];
Random.Shared.Shuffle(CollectionsMarshal.AsSpan(list));
1
 Аватар для Doomov
1056 / 335 / 119
Регистрация: 28.11.2020
Сообщений: 1,066
11.11.2023, 13:25
OwenGlendower, не сообразил сразу, "сувал" коллекцию, а надо было массив (или как у вас вариант span). Еще раз спасибо
0
Администратор
Эксперт .NET
 Аватар для OwenGlendower
18298 / 14222 / 5368
Регистрация: 17.03.2014
Сообщений: 28,898
Записей в блоге: 1
11.11.2023, 13:30
Doomov, у Shuffle только две перегрузки - под T[] и Span<T>. Поэтому и приходится прибегать к некрасивому коду с маршаллингом. Я бы предпочел чтобы у List<T> был экземплярный метод Shuffle, но его почему-то нет
1
Эксперт .NET
 Аватар для Wolfdp
3790 / 1767 / 371
Регистрация: 15.06.2012
Сообщений: 6,543
Записей в блоге: 3
11.11.2023, 21:57
Цитата Сообщение от golosalex Посмотреть сообщение
линк хорош чтобыы большой код ужать, но если вы не понимаете какой именно код вы ужимаете и используете линк как магию
Не знаю как для остальных, а лично для меня это всегда магия. Закидываешь источник, а он выдает нужное. Шо там внутри -- одна Хоро ведает.

Если чуть серьезней -- чем раньше люди начнут применять linq, тем больше шансов что в дальнейшем вместо велосипедов будет лаконичный код (и как правило более оптимизированный, новички редко умеют в перфоманс). Для понимания достаточно изучить что такое массивы, IEnumerable, методы расширения и <T>.

Цитата Сообщение от Элд Хасп Посмотреть сообщение
Каждый раз при вызове метода создавать новый экземпляр Random тоже не стоит.
А если метод нужно вызвать один раз, и дальше модуль вообще нигде не используется? Я бы сказал что в зависимости от частоты использования, имеют право на жизнь несколько подходов:
- создавать в методе (при единичном вызове оптимально)
- создать как статическое поле (при частом вызове самое оно)
- создать как поле класса, и юзать вообще объект (случай когда нужно раз в час вызвать много раз в конкретном участке кода)

Цитата Сообщение от Wolfdp Посмотреть сообщение
- random.Next (n + 1), где n--; точно даст нормальное мат-распределение?
быстрый чек показал что "ок". Но млин, запись... брррр. Впечатление что бездумно взято отсюда. И тут даже вопрос не в "c linq короче", а просто сам факт постоянных n-- n+1, хотя можно было просто пройтись for и свапнуть с рандомной позицией на весь массив.

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
var dic = new Dictionary<int, int>()
{
    { 1, 0 },
    { 2, 0 },
    { 3, 0 },
    { 4, 0 },
    { 5, 0 },
    { 6, 0 },
    { 7, 0 },
    { 8, 0 },
    { 9, 0 },
    { 10, 0 }
};
const int total = 1_000_000;
var origin = dic.Keys.ToArray();
var arr = new int[origin.Length];
var random = new Random();
 
for (var i = 0; i < total; i++)
{
    #region 1
 
    origin.CopyTo(arr, 0);
    var n = arr.Length;
    while (n > 1)
    {
        n--;
        int k = random.Next(n + 1);
        (arr[n], arr[k]) = (arr[k], arr[n]);
    }
 
    #endregion
 
    #region 1.2
 
    //origin.CopyTo(arr, 0);
    //for(var x = 0; x < arr.Length; x++)
    //{
    //    var y = random.Next(arr.Length);
    //    (arr[x], arr[y]) = (arr[y], arr[x]);
    //}
 
    #endregion
 
    #region 2
    //arr = origin.OrderBy(_ => random.Next()).ToArray();
    #endregion
 
    dic[arr.Last()]++;
}
 
foreach ((var key, var val) in dic)
    Console.WriteLine($"{key:D2} - {val * 100 / total}%");
 
Console.ReadKey();

Не по теме:

Цитата Сообщение от OwenGlendower Посмотреть сообщение
кстати, в .NET 8
итить... надо хоть заглянуть в него...

0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
11.11.2023, 21:57
Помогаю со студенческими работами здесь

Функция рандом
Небольшой вопросик кто знает как работает функция рамдом в с#? Может она постоянно выбивать одно число, если да можно сделать рамдом более...

Рандом из массива + и -
Всем привет, нужен рандом из массива плюс и минус. Нагуглил что-то подобное, рандом работает, но вычисления нет, ниже код. Что не так? ...

Задание на рандом
Подскажите пожалуйста, как сделать задания Дан класс Car в котором есть цена и выбор рандомного цвета(из цветов зеленый, красный,...

Работа с Рандом-ом
Ребята подскажите как прописать рандом для такого примера(пример игровое сражение) Нанесение урона персонажем и противником по...

Рандом с проверкой
Всем привет. Пишу игру на юнити. Возникла проблема.Есть условие: if (mount == 1) { ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
[Owen Logic] Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора
ФедосеевПавел 14.03.2026
Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора ВВЕДЕНИЕ Выполняя задание на управление насосной группой заполнения резервуара,. . .
делаю науч статью по влиянию грибов на сукцессию
anaschu 13.03.2026
прикрепляю статью
SDL3 для Desktop (MinGW): Создаём пустое окно с нуля для 2D-графики на SDL3, Си и C++
8Observer8 10.03.2026
Содержание блога Финальные проекты на Си и на C++: hello-sdl3-c. zip hello-sdl3-cpp. zip Результат:
Установка CMake и MinGW 13.1 для сборки С и C++ приложений из консоли и из Qt Creator в EXE
8Observer8 10.03.2026
Содержание блога MinGW - это коллекция инструментов для сборки приложений в EXE. CMake - это система сборки приложений. Здесь описаны базовые шаги для старта программирования с помощью CMake и. . .
Как дизайн сайта влияет на конверсию: 7 решений, которые реально повышают заявки
Neotwalker 08.03.2026
Многие до сих пор воспринимают дизайн сайта как “красивую оболочку”. На практике всё иначе: дизайн напрямую влияет на то, оставит человек заявку или уйдёт через несколько секунд. Даже если у вас. . .
Модульная разработка через nuget packages
DevAlt 07.03.2026
Сложившийся в . Net-среде способ разработки чаще всего предполагает монорепозиторий в котором находятся все исходники. При создании нового решения, мы просто добавляем нужные проекты и имеем. . .
Модульный подход на примере F#
DevAlt 06.03.2026
В блоге дяди Боба наткнулся на такое определение: В этой книге («Подход, основанный на вариантах использования») Ивар утверждает, что архитектура программного обеспечения — это структуры,. . .
Управление камерой с помощью скрипта OrbitControls.js на Three.js: Вращение, зум и панорамирование
8Observer8 05.03.2026
Содержание блога Финальная демка в браузере работает на Desktop и мобильных браузерах. Итоговый код: orbit-controls-threejs-js. zip. Сканируйте QR-код на мобильном. Вращайте камеру одним пальцем,. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru