Форум программистов, компьютерный форум, киберфорум
Delphi для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 5.00/21: Рейтинг темы: голосов - 21, средняя оценка - 5.00
14 / 13 / 2
Регистрация: 31.08.2011
Сообщений: 506
1

Генерация случайных чисел без повторений

03.09.2019, 20:04. Показов 4225. Ответов 19
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Код создает случайные числа без повторений
И он их создает, но в самом конце дописывает одно и тоже число " 1634588 ". Как это убрать?

Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
procedure TForm2.sButton2Click(Sender: TObject);
var t:TStringList;
    a:array[0..230] of integer;
    n,i,x:integer;
begin
sMemo1.Clear;
n:=20;
randomize;
t:=TStringList.Create;
a[0]:=random(230);
t.Add(inttostr(a[0]));
for i:=1 to n-1 do
 begin
  repeat
  x:=random(230);//не меньше
  until t.IndexOf(inttostr(x))=-1;
  a[i]:=x;
  t.Add(inttostr(x));
 end;
for i:=0 to n do
sMemo1.Lines.Add(inttostr(a[i])) ;
end;
0
Лучшие ответы (1)
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
03.09.2019, 20:04
Ответы с готовыми решениями:

Генерация случайных чисел
Парни, подскажите как сделать генератор случайных чисел. Мы вводим диапазон чисел например 0-3,...

Генерирование случайных чисел без Random
Пишу программу для зашифровки текста, для сдвига символа на определённое количество. Не то-чтобы...

Массив без повторений
Доброго времени суток! Как реализовать генерацию случайного массива из 4 элементов числами от 1 до...

Случайные числа без повторений
Ребятушки, подскажите пожалуйста. Есть i1:=RandomRange(1,100); i2:=RandomRange(1,100); Как...

19
Злостный нарушитель
9684 / 5245 / 1197
Регистрация: 12.03.2015
Сообщений: 24,719
03.09.2019, 20:07 2
Цитата Сообщение от Michalich Посмотреть сообщение
Код создает случайные числа без повторений
Это говнокод. Выбрось щас жэ!
Числа без повторений надо получать перестановками внутри массива, изначально заполненного индексами по возрастанию или убыванию.
1
14 / 13 / 2
Регистрация: 31.08.2011
Сообщений: 506
03.09.2019, 20:17  [ТС] 3
Цитата Сообщение от Verevkin Посмотреть сообщение
Это говнокод. Выбрось щас жэ!
этот то выброшу, а другого нет.
Цитата Сообщение от Verevkin Посмотреть сообщение
Числа без повторений надо получать перестановками внутри массива, изначально заполненного индексами по возрастанию или убыванию.
А с этим мне долго разбираться придется.
0
Злостный нарушитель
9684 / 5245 / 1197
Регистрация: 12.03.2015
Сообщений: 24,719
03.09.2019, 20:29 4
Цитата Сообщение от Michalich Посмотреть сообщение
этот то выброшу, а другого нет.
Ну так напиши его. Это и есть прикладное программирование.
Цитата Сообщение от Michalich Посмотреть сообщение
А с этим мне долго разбираться придется.
Лучше день потерять потом за пять минут долететь. ©
Кликните здесь для просмотра всего текста


1
14 / 13 / 2
Регистрация: 31.08.2011
Сообщений: 506
03.09.2019, 20:33  [ТС] 5
А почему все таки в конце пишет это число? И откуда оно берется?
0
Злостный нарушитель
9684 / 5245 / 1197
Регистрация: 12.03.2015
Сообщений: 24,719
03.09.2019, 20:35 6
Лучший ответ Сообщение было отмечено Michalich как решение

Решение

Цитата Сообщение от Michalich Посмотреть сообщение
А почему все таки в конце пишет это число? И откуда оно берется?
Забудь про этот код, я настаиваю.
0
Модератор
3758 / 2262 / 784
Регистрация: 15.11.2015
Сообщений: 9,004
03.09.2019, 21:35 7
Цитата Сообщение от Michalich Посмотреть сообщение
И откуда оно берется?
Из не инициализорованного элемента массива под номером 20. В последнем цикле надо считать до n-1.

Этот метод получения уникального случайного числа годится только в одном случае - если уже есть набор чисел, который нельзя менять и в который надо добавить уникальное случайное число.
Для остальных случаев уже посоветовали, как правильно сделать массив неповторяющихся случайных чисел.
1
Модератор
9650 / 6258 / 2427
Регистрация: 21.01.2014
Сообщений: 26,692
Записей в блоге: 3
04.09.2019, 04:56 8
Цитата Сообщение от Michalich Посмотреть сообщение
Код создает случайные числа без повторений

Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
uses ..., Math;
 
procedure TForm1.FormCreate(Sender: TObject);
begin
  Randomize;
end;
 
procedure TForm1.Button1Click(Sender: TObject);
const N = 230;
var L: TStringList;
    i: integer;
begin
  L := TStringList.Create;
  for i := 1 to N do
    L.Add(IntToStr(i));
  for i := 0 to N - 1 do
    L.Exchange(i, RandomRange(0, N));
  Memo1.Lines.Assign(L);
  L.Free;
end;
3
3048 / 1668 / 656
Регистрация: 19.03.2019
Сообщений: 5,376
04.09.2019, 09:56 9
Цитата Сообщение от D1973 Посмотреть сообщение
Delphi
1
2
for i := 0 to N - 1 do
         L.Exchange(i, RandomRange(0, N));
кстати, от предложенного тут Раздача карт при игре в дурака, количество игроков задается с клавиатуры варианта перемешивания результат будет отличаться?

Добавлено через 6 минут
я имею в виду будет ли отличие от такого варианта
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
procedure TForm1.FormCreate(Sender: TObject);
begin
  Randomize;
end;
 
// перемешать числа от 1 до N и вывести в Memo1 
procedure TForm1.Button1Click(Sender: TObject);
const N = 230;
var L: TStringList;
    i,k: integer;
begin
  L := TStringList.Create;
  for i := 1 to N do
    L.Add(IntToStr(i));
 
  for i:=1 to N-1 do
  begin
    k:= Random(N-i+1)+i;
    if k<>i then L.Exchange(i-1,k-1)   
  end;
 
  Memo1.Lines.Assign(L);
  L.Free;
end;
1
14 / 13 / 2
Регистрация: 31.08.2011
Сообщений: 506
04.09.2019, 10:35  [ТС] 10
Спасибо, а как выводить в memo только нужное количество чисел? Не первые допустим 20 чисел брать из StringList, а тоже
в случайном порядке вывести из 230 только 20 чисел
0
3048 / 1668 / 656
Регистрация: 19.03.2019
Сообщений: 5,376
04.09.2019, 10:49 11
Цитата Сообщение от Michalich Посмотреть сообщение
Спасибо, а как выводить в memo только нужное количество чисел? Не первые допустим 20 чисел брать из StringList, а тоже
все числа в StringList уже перемешаны.
Вот и бери нужное число чисел.

вместо
Delphi
1
Memo1.Lines.Assign(L);
Delphi
1
2
Memo1.Lines.Clear;
for i:=0 to 19 do Memo1.Lines.Append(L.Strings[i]);
1
14 / 13 / 2
Регистрация: 31.08.2011
Сообщений: 506
04.09.2019, 11:15  [ТС] 12
mr-Crocodile, Спасибо!
0
3048 / 1668 / 656
Регистрация: 19.03.2019
Сообщений: 5,376
04.09.2019, 11:19 13
Цитата Сообщение от Michalich Посмотреть сообщение
mr-Crocodile, Спасибо!
не за что.

кстати, если нужно, то легко сделать так, чтобы первый раз нажал на кнопку - в мемо попали первые случайные 20 чисел,
второй раз нажал - следующие 20 чисел (без повторов) и т.д., пока числа в StringList не закончатся.

для этого достаточно сделать StringList глобальным, заполнять и мешать в TForm1.FormCreate() + завести глобальную переменную, чтобы знать, какие числа брать в очередной раз.

тебе это надо? код написать?
0
4 / 4 / 2
Регистрация: 06.03.2019
Сообщений: 89
04.09.2019, 11:24 14
Автор темы, скорее всего у тебя просто не инициализирована переменная была. пробовал бы через отладку и наблюдателя посмотреть, что делается с переменными, потом бы и установил где ошибка. хотя я всё делал проще, когда у меня отладка нормально не работала, я просто назначал label ту или иную переменную, выстраивал их в ряд и смотреть пошагово, что изменяется и на сколько. Хотя данный метод решения подойдёт только, когда переменных до 20, потому что в вашем случае массив.
1
14 / 13 / 2
Регистрация: 31.08.2011
Сообщений: 506
04.09.2019, 11:40  [ТС] 15
Цитата Сообщение от mr-Crocodile Посмотреть сообщение
кстати, если нужно, то легко сделать так, чтобы первый раз нажал на кнопку - в мемо попали первые случайные 20 чисел,
второй раз нажал - следующие 20 чисел (без повторов) и т.д., пока числа в StringList не закончатся.
для этого достаточно сделать StringList глобальным, заполнять и мешать в TForm1.FormCreate() + завести глобальную переменную, чтобы знать, какие числа брать в очередной раз.
тебе это надо? код написать?
Нет, спасибо. Этого достаточно.
0
Модератор
9650 / 6258 / 2427
Регистрация: 21.01.2014
Сообщений: 26,692
Записей в блоге: 3
04.09.2019, 11:54 16
Цитата Сообщение от mr-Crocodile Посмотреть сообщение
результат будет отличаться?
По сути, метод Exchange класса TStringList примерно так и работает:
Classes.pas
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
procedure TStringList.Exchange(Index1, Index2: Integer);
begin
  if (Index1 < 0) or (Index1 >= FCount) then Error(@SListIndexError, Index1);
  if (Index2 < 0) or (Index2 >= FCount) then Error(@SListIndexError, Index2);
  Changing;
  ExchangeItems(Index1, Index2);
  Changed;
end;
 
procedure TStringList.ExchangeItems(Index1, Index2: Integer);
var
  Temp: Integer;
  Item1, Item2: PStringItem;
begin
  Item1 := @FList^[Index1];
  Item2 := @FList^[Index2];
  Temp := Integer(Item1^.FString);
  Integer(Item1^.FString) := Integer(Item2^.FString);
  Integer(Item2^.FString) := Temp;
  Temp := Integer(Item1^.FObject);
  Integer(Item1^.FObject) := Integer(Item2^.FObject);
  Integer(Item2^.FObject) := Temp;
end;
1
3048 / 1668 / 656
Регистрация: 19.03.2019
Сообщений: 5,376
04.09.2019, 12:09 17
Цитата Сообщение от D1973 Посмотреть сообщение
По сути, метод Exchange класса TStringList примерно так и работает:
Простите, Вы не поняли вопрос.

Вы получаете номер, c каким элементом поменять i-й элемента массива через RandomRange(0, N)
а специалисты рекомендую для обмена выбирать элемент из оставшихся (из тех, что больше i)
(посмотрите по ссылке выше, там упоминается статья, где это рассматривается с точки зрения распределения после перемешивания).

Т.о. предложенный второй вариант лучше.
0
Модератор
9650 / 6258 / 2427
Регистрация: 21.01.2014
Сообщений: 26,692
Записей в блоге: 3
04.09.2019, 12:23 18
Цитата Сообщение от mr-Crocodile Посмотреть сообщение
предложенный второй вариант лучше
Не буду спорить, лучше - так лучше... Мне для моих личных целей всегда моего варианта за глаза хватало, так что...
1
3048 / 1668 / 656
Регистрация: 19.03.2019
Сообщений: 5,376
04.09.2019, 14:52 19
Цитата Сообщение от D1973 Посмотреть сообщение
Не буду спорить, лучше - так лучше... Мне для моих личных целей всегда моего варианта за глаза хватало, так что...
Да, тут я с Вами согласен. в 99.999% для "домашнего использования" - как не перемешай, так и хорошо будет!
0
Модератор
9650 / 6258 / 2427
Регистрация: 21.01.2014
Сообщений: 26,692
Записей в блоге: 3
04.09.2019, 16:14 20

Не по теме:

Цитата Сообщение от mr-Crocodile Посмотреть сообщение
как не перемешай, так и хорошо будет!
Главное - пропорции соблюсти, как Д.М. Менделеев доказал (40/60)


1
04.09.2019, 16:14
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
04.09.2019, 16:14
Помогаю со студенческими работами здесь

Случайные числа без повторений
Подскажите как сделать такое: Случайным порядком через random в 10 memo вывести 200 цифр. То есть...

Заполнение массива случайными числами без повторений
Как сгенерировать массив от 1 до 15, чтобы ни одно число в массиве не повторялось и...

Вывести все гласные латинские буквы без повторений
Разработать функцию MakeStr(const S:string):string, вывести все ее гласные латинские буквы без...

Генерация случайных чисел без повторений
Задача такая:Заполнить массив (из 10 элементов) случайными числами от 10 до 50, без повторений....


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
Из чего и как собрать свой домашний кинотеатр
bt_guru 21.01.2025
Создание домашнего кинотеатра: от идеи до реализации В современном мире домашний кинотеатр стал неотъемлемой частью комфортного жилого пространства, предоставляя возможность наслаждаться. . .
Ошибки стиральных машин
bt_guru 21.01.2025
Современные стиральные машины представляют собой сложные электронные устройства, оснащенные множеством датчиков и систем контроля. Они способны самостоятельно определять вес загруженного белья,. . .
Копирование (маппинг) объектов в JavaScript
bytestream 21.01.2025
В современной разработке программного обеспечения копирование объектов представляет собой фундаментальную операцию, которая требует особого внимания и понимания. Маппинг объектов в JavaScript – это. . .
Как работать с Apache Kafka в C# .NET
bytestream 21.01.2025
Apache Kafka представляет собой распределенную платформу потоковой передачи данных, которая произвела революцию в области обработки больших объемов информации в реальном времени. Эта система,. . .
Как использовать RabbitMQ в C# .NET
bytestream 21.01.2025
RabbitMQ представляет собой мощный брокер сообщений, который эффективно решает эту задачу, обеспечивая надежную передачу данных между множеством приложений. Этот инструмент реализует протокол AMQP. . .
Как объединить последние коммиты в Git
bytestream 21.01.2025
В мире разработки программного обеспечения система контроля версий Git стала незаменимым инструментом для управления исходным кодом. Одной из наиболее полезных, но порой сложных для освоения функций. . .
Как запушить новую локальную ветку (branch) в удалённый репозиторий Git и отслеживать её
bytestream 21.01.2025
В современной разработке программного обеспечения система контроля версий Git стала неотъемлемым инструментом для эффективного управления кодом и организации командной работы. Одной из ключевых. . .
Как создать директорию и все родительские директории, указанные в пути, с помощью Python
bytestream 21.01.2025
Python предоставляет мощные инструменты для работы с файловой системой через встроенные модули os и pathlib, которые значительно упрощают процесс манипуляции директориями. Эти модули содержат. . .
Как работать с массивами в JavaScript
bytestream 21.01.2025
Массивы в JavaScript представляют собой один из фундаментальных типов данных, который позволяет хранить упорядоченные коллекции различных элементов в одной переменной. Эта структура данных является. . .
Какая максимальная длина адреса (URL) в различных браузерах и стандартах
bytestream 21.01.2025
В современном мире интернет-технологий URL-адреса (Uniform Resource Locator) играют фундаментальную роль в функционировании веб-пространства. Эти уникальные идентификаторы ресурсов стали неотъемлемой. . .
Как сбросить локальный репозиторий до состояния удалённого репозитория Git
bytestream 21.01.2025
При разработке программного обеспечения с использованием системы контроля версий Git разработчики часто сталкиваются с необходимостью синхронизации локального и удаленного репозиториев. Данная задача. . .
Как запретить подсветку выделенного текста с помощью CSS
bytestream 20.01.2025
Подсветка текста при выделении является стандартным поведением браузера, которое не всегда соответствует дизайнерским решениям или функциональным требованиям веб-приложения. Выделение текста может. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru