Форум программистов, компьютерный форум, киберфорум
C# для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.74/47: Рейтинг темы: голосов - 47, средняя оценка - 4.74
0 / 0 / 0
Регистрация: 18.11.2017
Сообщений: 13
.NET 4.x

Создать случайное число с неповторяющимися цифрами

22.06.2018, 11:36. Показов 10244. Ответов 47
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте. Как создать случайное число с не повторяющимися цифрами, например: 1234. 1974. 3784 и т.д.
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
22.06.2018, 11:36
Ответы с готовыми решениями:

Сгенерировать случайное число с разными цифрами
Доброго всем здравия духовного и телесного. Нужно получить 4-значное число с разными цифрами, но и это еще не все, а потом преобразовать...

Сформировать пятизначное случайное число с различными цифрами
Сформировать пятизначное случайное число с различными цифрами, вывести его на экран. Заранее спасибо!

Найти все десятизначные числа с неповторяющимися цифрами
C++ - Найти все десятизначные числа с неповторяющимися цифрами без массивов если можно ,просто циклами пожалуйста ,не могу решить (

47
Wanna be serious
 Аватар для Bespridelschic
587 / 474 / 186
Регистрация: 31.07.2013
Сообщений: 1,693
22.06.2018, 11:40
Рандомное число:
C#
1
2
Random rand = new Random();
int = rand.Next(0, 1000);
Если нужно несколько, то делаете цикл в котором проверяете, было ли сгенерировано подобное число. Если число уже сгенерировано - генерируете новое
0
Администратор
Эксперт .NET
 Аватар для OwenGlendower
18260 / 14185 / 5366
Регистрация: 17.03.2014
Сообщений: 28,871
Записей в блоге: 1
22.06.2018, 16:36
Подорожник, вариант №1 - генерация цифр по отдельности
C#
1
2
3
4
5
6
7
8
9
10
Random rnd = new Random();
var digits = Enumerable.Range(0, 10).ToList();
int result = 0;
for (int i = 0, power10=1000; i < 4; i++, power10 /= 10)
{
    int digit = digits[rnd.Next(i == 0 ? 1 : 0, digits.Count)];
    result += digit * power10;
    digits.Remove(digit);
}
Console.WriteLine(result);
Вариант №2 - генерация всего списка чисел заранее и выбор из него. Удобно если такие числа нужно генерировать часто.
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
// Заранее генерируем все числа
int[] digits = Enumerable.Range(0, 10).ToArray();
var allNumbers = (
    from d1 in digits.Skip(1)
    from d2 in digits.Where(n => n != d1)
    from d3 in digits.Where(n => n != d1 && n != d2)
    from d4 in digits.Where(n => n != d1 && n != d2 && n != d3)
    select d1*1000 + d2*100 + d3*10 + d4
).ToArray();
 
// Выбираем одно из них
Random rnd = new Random();
int result = allNumbers[rnd.Next(allNumbers.Length)];
Console.WriteLine(result);
Цитата Сообщение от Bespridelschic Посмотреть сообщение
int = rand.Next(0, 1000);
Это даст просто случайное число, но никак не число без повторений цифр.
1
Wanna be serious
 Аватар для Bespridelschic
587 / 474 / 186
Регистрация: 31.07.2013
Сообщений: 1,693
22.06.2018, 16:40
Цитата Сообщение от OwenGlendower Посмотреть сообщение
Это даст просто случайное число, но никак не число без повторений цифр.
Цитата Сообщение от Bespridelschic Посмотреть сообщение
Если нужно несколько, то делаете цикл в котором проверяете, было ли сгенерировано подобное число. Если число уже сгенерировано - генерируете новое
Упомянул
0
Администратор
Эксперт .NET
 Аватар для OwenGlendower
18260 / 14185 / 5366
Регистрация: 17.03.2014
Сообщений: 28,871
Записей в блоге: 1
22.06.2018, 16:46
Bespridelschic, внимательнее прочитай задание. ТСу нужно чтобы цифры в числе не повторялись.
0
Wanna be serious
 Аватар для Bespridelschic
587 / 474 / 186
Регистрация: 31.07.2013
Сообщений: 1,693
22.06.2018, 16:48
OwenGlendower, прошу прощения, не обратил внимание
0
 Аватар для TuM0xA
212 / 210 / 137
Регистрация: 21.12.2015
Сообщений: 545
23.06.2018, 19:09
если для чисел из четырех цифр то:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
using System;
static class test
{
    static void Main()
    {
            int[] digits = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 };
            int buf, j, i, p = 1000, res = 0;
            Random r = new Random();
            for (i = 0; i < 10; i++)
            {
                j = r.Next(10);
                buf = digits[i];
                digits[i] = digits[j];
                digits[j] = buf;
            }
            if (digits[0] == 0) i = 1;
            else i = 0;
            for (; p >= 1; p /= 10, i++) res += digits[i] * p;
            Console.WriteLine(res);
    }
}
Добавлено через 1 час 2 минуты
а вот универсальная функция для генерации чисел любой длины(до 10)
если len = 0 то функция выбирает случайную длину
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
using System;
static class test
{
    static long GenerateNumberWithUniqueDigits(int len, Random r)
    {
        if (len >= 0 && len <= 10)
        {
            long res = 0, p = 1;
            int i, j, buf;
            int[] digits = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 };
            r = r ?? new Random();
            if (len == 0) len = r.Next(1, 11);
            for (i = 0; i < 10; i++)
            {
                j = r.Next(10);
                buf = digits[i];
                digits[i] = digits[j];
                digits[j] = buf;
            }
            if (len>1 && digits[0]==0)
            {
                j = r.Next(1, 10);
                digits[0] = digits[j];
                digits[j] = 0;
            }
            while (--len > 0) p *= 10;
            for (i = 0; p>=1; i++, p /= 10) res += digits[i] * p;
            return res;
        }
        else throw new Exception("len must be in [0;10]");
    }
    static void Main()
    {
        Random r = new Random();
        while (true)
        {
            Console.WriteLine(GenerateNumberWithUniqueDigits(0, r));
            Console.ReadKey(true);
        }
    }
}
2
 Аватар для diadiavova
7258 / 2605 / 744
Регистрация: 11.04.2015
Сообщений: 4,149
Записей в блоге: 43
23.06.2018, 21:24
Цитата Сообщение от TuM0xA Посмотреть сообщение
а вот универсальная функция для генерации чисел любой длины(до 10)
Можно сделать короче
C#
1
2
3
4
5
6
        static long GetUniqDigsNum(int len, Random rnd)
        {
            if (len < 1 || len > 10) throw new ArgumentException("Количество цифр должно быть от 1 до 10", "len");
            var digs = "0123456789".OrderBy(i => rnd.Next()).ToArray().Take(len);
            return long.Parse(string.Join("", digs.First() == '0' ? digs.Reverse() : digs));
        }
2
1123 / 794 / 219
Регистрация: 15.08.2010
Сообщений: 2,185
23.06.2018, 22:20
Цитата Сообщение от diadiavova Посмотреть сообщение
Можно сделать короче
случайности не случайны?
C#
1
2
3
79 = 11382
80 = 22115
81 = 11117
Цитата Сообщение от TuM0xA Посмотреть сообщение
а вот универсальная функция для генерации чисел любой длины(до 10)
или случайны?
C#
1
2
3
4
5
6
7
8
9
10
0 = 100030
1 = 129225
2 = 120225
3 = 110965
4 = 104457
5 = 97698
6 = 91182
7 = 86759
8 = 81916
9 = 77543
1
 Аватар для diadiavova
7258 / 2605 / 744
Регистрация: 11.04.2015
Сообщений: 4,149
Записей в блоге: 43
23.06.2018, 22:23
Цитата Сообщение от КОП Посмотреть сообщение
случайности не случайны?
C#
1
2
3
79 = 11382
80 = 22115
81 = 11117
Это что? О_О
0
1123 / 794 / 219
Регистрация: 15.08.2010
Сообщений: 2,185
23.06.2018, 22:26
Цитата Сообщение от diadiavova Посмотреть сообщение
Это что? О_О
слева число, справа кол-во его в миллионе прогонов функции.
смысл чтоб числа справа были примерно равны, иначе рандом нечестный

вот, linq это я переименовал вашу функцию
C#
1
2
3
4
5
6
7
8
9
10
11
            Random r = new Random();
            ConcurrentDictionary<int, int> d = new ConcurrentDictionary<int, int>();
            for (int i = 0; i < 1000000; i++)
            {
                d.AddOrUpdate(linq(2, r), 1, (id, count) => count + 1);
            }
            foreach(var k in d.Keys)
            {
                Console.WriteLine($"{k} = {d[k]}");
            }
            Console.ReadLine();
1
 Аватар для diadiavova
7258 / 2605 / 744
Регистрация: 11.04.2015
Сообщений: 4,149
Записей в блоге: 43
23.06.2018, 22:52
Цитата Сообщение от КОП Посмотреть сообщение
смысл чтоб числа справа были примерно равны, иначе рандом нечестный
Ну я не знаю, как это связано с заданием, где речи о "честном" рандоме не было. Но строго говоря, "примерно равны" это сколько. Если из миллиона прогонов количество одинаковых случаев отличается на 10000, то это один процент всех прогонов. Это можно считать как "примерно равны"? Ну и к тому же, я ведь не являюсь повелителем рандома))

Кстати, а почему моя функция тестировалась на двузначных числах, а функцияTuM0xA - на однозначных? Моя на однозначных тоже выдает разницу появлений примерно около 800.
Ну и наконец: какие есть еще варианты?

Добавлено через 1 минуту

Не по теме:

Пути рандома неисповедимы))

0
1123 / 794 / 219
Регистрация: 15.08.2010
Сообщений: 2,185
23.06.2018, 23:05
Цитата Сообщение от diadiavova Посмотреть сообщение
Ну я не знаю, как это связано с заданием, где речи о "честном" рандоме не было.
ну раз не было...
C#
1
return int.Parse("1234567890".Substring(0, len));
Цитата Сообщение от diadiavova Посмотреть сообщение
Но строго говоря, "примерно равны" это сколько.
Конкретной величины не существует, но разница в 2 раза намекает, что рандом предвзят с ооочень большой вероятностью.
Цитата Сообщение от diadiavova Посмотреть сообщение
Ну и к тому же, я ведь не являюсь повелителем рандома))
срыв покровов
Цитата Сообщение от diadiavova Посмотреть сообщение
Кстати, а почему моя функция тестировалась на двузначных числах, а функцияTuM0xA - на однозначных? Моя на однозначных тоже выдает разницу появлений примерно около 800.
на однозначных все в порядке у вас, TuM0xA тестил на однозначных, так как можно выложить все 10 строк результата. Но и на 2+значных там тоже косяк у него.

PS: кроме того, если принять Random за чистый рандом, то можно математически вывести ожидание для чисел длины Х. В вашем случае ожидание 80 будет в 2 раза больше чем скажем 79. У TuM0xA посложнее, считать я конечно не буду.

Цитата Сообщение от diadiavova Посмотреть сообщение
Ну и наконец: какие есть еще варианты?
написать теоретически верную функцию приняв класс Random за честный рандом.
0
 Аватар для diadiavova
7258 / 2605 / 744
Регистрация: 11.04.2015
Сообщений: 4,149
Записей в блоге: 43
23.06.2018, 23:16
Цитата Сообщение от КОП Посмотреть сообщение
ну раз не было...
Вот что-то мне подсказывает, что мой вариант подойдет ТС, а насчет этого я сильно сомневаюсь))
Цитата Сообщение от КОП Посмотреть сообщение
Конкретной величины не существует, но разница в 2 раза намекает, что рандом предвзят с ооочень большой вероятностью.
Если задать шестизначные числа, то некоторые могут три раза попасться, а другие - один, причем это имело бы место независимо от степени "честности" рандома. А разница однако - трехкратная. Думаю там варианты и покруче могут быть. Так может все-таки есть смысл вычислять минимум и максимум в количестве повторов и сравнивать его с общим количеством прогонов, а не между собой? Ну я не силен в математической статистике, так что может ты и прав, но что-то мне все-таки подсказывает, что ты тоже не все учел.
Цитата Сообщение от КОП Посмотреть сообщение
написать теоретически верную функцию приняв класс Random за честный рандом.
Было бы неплохо увидеть ее уже написанной человеком, который в этом разбирается. ))
1
1123 / 794 / 219
Регистрация: 15.08.2010
Сообщений: 2,185
23.06.2018, 23:35
Цитата Сообщение от diadiavova Посмотреть сообщение
то некоторые могут три раза попасться, а другие - один
ну не в такой же малой выборке, давайте еще на 1 прогоне будем ждать все числа одновременно)
Цитата Сообщение от diadiavova Посмотреть сообщение
Так может все-таки есть смысл вычислять минимум и максимум в количестве повторов и сравнивать его с общим количеством прогонов, а не между собой?
я же написал, можно аналитически доказать корректность функции, в вашем случае шанс 80 ровно в 2 раза больше 79. Мой тест лишь обход теории брутфорсом.
Цитата Сообщение от diadiavova Посмотреть сообщение
что ты тоже не все учел
например псевдорандом

Цитата Сообщение от diadiavova Посмотреть сообщение
Было бы неплохо увидеть ее уже написанной человеком, который в этом разбирается. ))
не самый быстрый вариант, но мы же не торопимся.

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
        static int pure(int len, Random rnd)
        {
            if (len == 1) return rnd.Next(0, 10);
 
            var digits = new List<int>{ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 };
            int r = rnd.Next(1, 10);
            int res = digits[r];
            digits.RemoveAt(r);
            while (len-- > 1)
            {
                r = rnd.Next(0, digits.Count);
                res = res * 10 + digits[r];
                digits.RemoveAt(r);
            }
            return res;
        }
Добавлено через 6 минут
PS: лонг от переполненя забыл, в остальном должно работать
2
64 / 64 / 35
Регистрация: 14.12.2015
Сообщений: 145
23.06.2018, 23:51
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
public  IEnumerable<int> GetRandomDigitsSequence(int length)
{
    if (length > 10)
    {
        throw new ArgumentException(nameof(length) + " must be less then 10");
    }
    var exclude = new List<int>();
    for (var i = 0; i < length; i++)
    {
        var range = Enumerable.Range(0, 10).Where(x => !exclude.Contains(x)).ToList();
        var index = _random.Next(0, 10 - exclude.Count);
        var result = range.ElementAt(index);
        exclude.Add(result);
        yield return result;
    }
}
0
 Аватар для diadiavova
7258 / 2605 / 744
Регистрация: 11.04.2015
Сообщений: 4,149
Записей в блоге: 43
23.06.2018, 23:52
Цитата Сообщение от КОП Посмотреть сообщение
не самый быстрый вариант, но мы же не торопимся.
Да, результат существенно лучше.
0
1123 / 794 / 219
Регистрация: 15.08.2010
Сообщений: 2,185
23.06.2018, 23:59
dotnethood, если считать 02 числом длины 2, то да)
автор кстати длину как параметр не упоминал вообще
0
 Аватар для TuM0xA
212 / 210 / 137
Регистрация: 21.12.2015
Сообщений: 545
24.06.2018, 00:41
Цитата Сообщение от КОП Посмотреть сообщение
Но и на 2+значных там тоже косяк у него.
если в моей реализации увеличить количество перетасовываний массива цифр
то результаты значительно улучшаются
но это при этом опускается производительность
C#
1
2
3
4
5
6
7
8
            for (int d = 3; d >= 1; d--)
                for (i = 0; i < 10; i++)
                {
                    j = r.Next(10);
                    buf = digits[i];
                    digits[i] = digits[j];
                    digits[j] = buf;
                }
1
 Аватар для TuM0xA
212 / 210 / 137
Регистрация: 21.12.2015
Сообщений: 545
24.06.2018, 00:49
вот
Миниатюры
Создать случайное число с неповторяющимися цифрами  
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
24.06.2018, 00:49
Помогаю со студенческими работами здесь

Найти количество чисел в отрезке [Q;S] с неповторяющимися цифрами
Даны целые числа Q и S; 1&lt;=Q&lt;=S&lt;=100,000,000 Нужно найти в диапазоне все числа, у которых цифры не повторяются. Например, между 11 и 99...

Как создать обсолютно случайное число
Здравствуйте. Как создать обсолютно случайное число в AC2? Дело в том что стандартным методом число все равно получается не обсолютно...

Найти все десятизначные числа с неповторяющимися цифрами, при делении которых на 9 получается симметричное частное
Здравствуйте, друзья. Вот задача: Найти все десятизначные числа с неповторяющимися цифрами, при делении которых на 9 получается...

Создать функцию с целочисленными параметрами a и b, возвращающую случайное число из отрезка [a;b]
Создать функцию, которая будет иметь два целочисленных параметра a и b, и в качестве своего значения возвращать случайное целое число из...

Создать пакетный файл, который генерирует случайное число в пределах 0-100...
Парни помогите, нужно создать пакетный файл,который генерирует случайное число в пределах 0-100 и выдает запрос пользователю на ввод числа....


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
http://iceja.net/ математические сервисы
iceja 20.01.2026
Обновила свой сайт http:/ / iceja. net/ , приделала Fast Fourier Transform экстраполяцию сигналов. Однако предсказывает далеко не каждый сигнал (см ограничения http:/ / iceja. net/ fourier/ docs ). Также. . .
http://iceja.net/ сервер решения полиномов
iceja 18.01.2026
Выкатила http:/ / iceja. net/ сервер решения полиномов (находит действительные корни полиномов методом Штурма). На сайте документация по API, но скажу прямо VPS слабенький и 200 000 полиномов. . .
Расчёт переходных процессов в цепи постоянного тока
igorrr37 16.01.2026
/ * Дана цепь постоянного тока с R, L, C, k(ключ), U, E, J. Программа составляет систему уравнений по 1 и 2 законам Кирхгофа, решает её и находит переходные токи и напряжения на элементах схемы. . . .
Восстановить юзерскрипты Greasemonkey из бэкапа браузера
damix 15.01.2026
Если восстановить из бэкапа профиль Firefox после переустановки винды, то список юзерскриптов в Greasemonkey будет пустым. Но восстановить их можно так. Для этого понадобится консольная утилита. . .
Сукцессия микоризы: основная теория в виде двух уравнений.
anaschu 11.01.2026
https:/ / rutube. ru/ video/ 7a537f578d808e67a3c6fd818a44a5c4/
WordPad для Windows 11
Jel 10.01.2026
WordPad для Windows 11 — это приложение, которое восстанавливает классический текстовый редактор WordPad в операционной системе Windows 11. После того как Microsoft исключила WordPad из. . .
Classic Notepad for Windows 11
Jel 10.01.2026
Old Classic Notepad for Windows 11 Приложение для Windows 11, позволяющее пользователям вернуть классическую версию текстового редактора «Блокнот» из Windows 10. Программа предоставляет более. . .
Почему дизайн решает?
Neotwalker 09.01.2026
В современном мире, где конкуренция за внимание потребителя достигла пика, дизайн становится мощным инструментом для успеха бренда. Это не просто красивый внешний вид продукта или сайта — это. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru