Форум программистов, компьютерный форум, киберфорум
Наши страницы
Delphi для начинающих
Войти
Регистрация
Восстановить пароль
 
 
Рейтинг 4.60/5: Рейтинг темы: голосов - 5, средняя оценка - 4.60
vladimir211
0 / 0 / 0
Регистрация: 25.10.2014
Сообщений: 47
1

Как в edit рандомно генерировать 4-х значное число, которое не будет повторяться?

15.11.2016, 15:13. Просмотров 985. Ответов 28
Метки нет (Все метки)

Как в edit рандомно генерировать 4-х значное число, которое не будет повторяться?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
15.11.2016, 15:13
Ответы с готовыми решениями:

Создать цикл, который будет повторяться через определенное количество раз
Как в delphi начать цикл который будет повторятся через определенное...

Как определить, скольки-значное число было введено?
Как определить какое введено число? 2-ухзначное 3-ёхзначное 4-ёхзначное и т.д. ?

Как число из одного edit'a ввести в другой edit только в 10 раз меньше
Есть Edit1 в него вводится число типа integer то есть целое и есть Edit2...

Как задать значение переменной которое введено в Edit?
Как задать значение переменной которое введено в Edit? вообщем чтобы из Edit...

Если 4х-значное число записать в обратном порядке, то получится число, на k меньшее первоначального.
Люди,добрые,помогите!!!!не знаю к кому уже обратиться. срочно нужно решить...

28
qwertehok
2300 / 2204 / 602
Регистрация: 29.08.2013
Сообщений: 14,727
15.11.2016, 15:16 2
Delphi
1
edit4.text:=random(1000)+random(9)*1000;
ну а проверку сами организуйте
0
DenNik
Непрофессионал
1801 / 1408 / 307
Регистрация: 26.07.2011
Сообщений: 7,872
15.11.2016, 17:54 3
предлагаю массив
Pascal
1
a: array[1000..9999] of boolean;
в котором отмечать при помощи true числа, которые уже были сгенерировны
0
cfbogd
botsik
259 / 259 / 140
Регистрация: 05.06.2016
Сообщений: 1,247
Записей в блоге: 1
15.11.2016, 18:01 4
Delphi
1
2
3
randomize;
for i:=1 to 4 do 
edit1.text:=edit1.text+inttostr(random(9));
а на счет повторения, склоняюсь к варианту с массивом
0
AHBAR
239 / 239 / 167
Регистрация: 05.04.2013
Сообщений: 1,106
15.11.2016, 19:17 5
cfbogd, только нужно
Delphi
1
random(10)
иначе 9 не будет выпадать
1
vladimir211
0 / 0 / 0
Регистрация: 25.10.2014
Сообщений: 47
19.11.2016, 01:34  [ТС] 6
DenNik, а можете пожалуйста написать примерчик, а то я не совсем понимаю
0
cfbogd
botsik
259 / 259 / 140
Регистрация: 05.06.2016
Сообщений: 1,247
Записей в блоге: 1
19.11.2016, 13:06 7
vladimir211,
Delphi
1
2
3
4
5
6
7
8
9
10
11
procedure TForm1.Button1Click(Sender: TObject);
var a:array[1000..9999] of boolean;
    b:integer;
begin
randomize;
repeat
b:=randomRange(1000,9999); //uses ... , Math ;
until a[b]<>true;
a[b]:=true;
memo1.Lines.Add(inttostr(b));
end;
0
DenNik
Непрофессионал
1801 / 1408 / 307
Регистрация: 26.07.2011
Сообщений: 7,872
21.11.2016, 10:36 8
cfbogd, еще бы предусмотреть случай, когда весь проверочный массив будет true. а то программа зависнет

Добавлено через 1 минуту
и кстати, массив должен быть вне процедуры генерации числа, т.е. глобальным
0
NIKOLAYY
819 / 717 / 339
Регистрация: 22.09.2012
Сообщений: 4,994
21.11.2016, 13:19 9
Можно сделать еще так, это будет более сложнее, но в данном методе будут неоспоримые плюсы!
Число никогда не повторится как в методах выше если оно повторяется то перегенерация снова и так до тех пор пока непопадется то число которого еще небыло.

Делаем массив от 1000 до 9999, заполняем его всеми числами попорядку!
Вытаскиваем из случайной ячейки массива число и удаляем его!

В результате код переберет все числа от 1000 до 9999 случайным образом без одного повтора!
0
DenNik
Непрофессионал
1801 / 1408 / 307
Регистрация: 26.07.2011
Сообщений: 7,872
21.11.2016, 14:12 10
NIKOLAYY, то же самое по сути. тот же цикл repeat Randomize.... until найдено число, также нужно будет изменять значение массива на ноль (в примере выше на true + та же проверка значения масива. глобально абсолютно нет отличий )

Добавлено через 2 минуты
Цитата Сообщение от NIKOLAYY Посмотреть сообщение
Вытаскиваем из случайной ячейки массива число и удаляем его!
думаю, это прокатит только со списком строк, тут да, ни одного повтора не будет. но возникает вопрос быстродействия и объема занимаемой памяти. сколько времени займет 9000 раз перераспределить память под список при каждом удалении элемента?

Добавлено через 1 минуту
че-то я заговорился. писал обуреваемый мыслью, что нужно СРАЗУ все числа сгенерировать
0
Пытливый
1380 / 691 / 249
Регистрация: 29.05.2013
Сообщений: 3,116
21.11.2016, 14:59 11
А не проще сделать массив в 9000 чисел и перемешать его?
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
var
  ADigit: Array[1..9000] of Integer;
  i: Integer;
  S: String;
 
 procedure IndexSwap(Index1, Index2: Integer);
 var Value: Integer;
 begin
  Value := ADigit[Index1];
  ADigit[Index1] := ADigit[Index2];
  ADigit[Index2] := Value;
 end;
begin
 for i := 1 to 9000
 do ADigit[i] := 999 + i;
 for i := 1 to 4500
 do IndexSwap(1 + Random(4500), 4500 + Random(4500));
end;
0
Joy
Эксперт Pascal/Delphi
2163 / 1194 / 1434
Регистрация: 29.08.2014
Сообщений: 4,373
21.11.2016, 15:56 12
так лучше мешает
Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
14
var
  a:array[1000..9999] of integer;
  i,j,t:integer;
begin
  randomize;
  for i:=1000 to 9999 do a[i]:=i;
  for i:=1000 to 9999 do begin
    j:=random(1000)+9000;
    t:=a[i];
    a[i]:=a[j];
    a[j]:=t;
  end;
  for i:=1000 to 9999 do writeln(a[i]);
end.
Добавлено через 9 минут
Пытливый, у вас плохо мешает - два индекса по рандому не гарантирует перестановку всех чисел. так например у вас в 99 случаев из 100 по индексу 9000 будет число 9999
0
Пытливый
1380 / 691 / 249
Регистрация: 29.05.2013
Сообщений: 3,116
21.11.2016, 22:41 13
Мога быть, мога быть. Особо не тестил. Я донес идею до автора, а ему самому неплохо было бы найти этот косяк.
0
Sergio Leone
2467 / 1112 / 579
Регистрация: 07.06.2014
Сообщений: 3,259
21.11.2016, 23:13 14
ребятки, не занимайтесь самодеятельностью!
Всё уже давно украдено придумано до нас!

мешать массив лучше так - http://www.cyberforum.ru/post7507860.html

смотри Тасование Фишера–Йетса - http://www.cyberforum.ru/post9563056.html
0
NIKOLAYY
819 / 717 / 339
Регистрация: 22.09.2012
Сообщений: 4,994
21.11.2016, 23:36 15
Цитата Сообщение от DenNik Посмотреть сообщение
думаю, это прокатит только со списком строк, тут да, ни одного повтора не будет. но возникает вопрос быстродействия и объема занимаемой памяти.
Ну я незнаю я писал через массив этот код и расписал как работает его не хитрый алгоритм в комментах и на форме.
Быстродействие незнаю, но мой код не будет несколько раз попадать в одно число а потом перегенирировать его до тех пор пока ненайдет того числа которого небыло.

Вобщем код сразу даст случайное число и без повтора!
Если посмотреть на скрин выделил красным- ни одного повтора!

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
25
26
27
28
29
30
31
var
  Form1: TForm1;
  mas: array[0..99] of Integer;
  n, i, velm: Integer;
implementation
 
{$R *.dfm}
 
procedure TForm1.FormCreate(Sender: TObject);
begin
  //заполним массив упорядоченно
  for i := 0 to 99 do
    mas[i] := i;
 
  n := 99; //для последнего числа в массиве
  velm := 99; //для выпавшего элемента (случайного числа)
end;
 
procedure TForm1.Button1Click(Sender: TObject);
begin
  velm := Random(n);
  ListBox1.Items.Add('рандом число = ' + IntToStr(velm) +
    ', число в этом элементе = ' + IntToStr(mas[velm]));
 
  //теперь в этом же элементе массива лежит число из последнего элемента массива
  mas[velm] := mas[n];
  velm := velm - 1;
  n := n - 1;
end;
 
end.
0
Миниатюры
Как в edit рандомно генерировать 4-х значное число, которое не будет повторяться?  
NIKOLAYY
819 / 717 / 339
Регистрация: 22.09.2012
Сообщений: 4,994
21.11.2016, 23:43 16
Просто в мой код трудно с первого раза как бы въехать, а смысл таков-
мы рандомируем число обращаемся к этому элементу массива и забираем и него число,
далее вставляем в этот элемент массива число из последнего элемента массива и последний элемент массива мы уже не используем.

В чем и заключается уникальность этого кода ни когда неповторять числа.
0
Joy
Эксперт Pascal/Delphi
2163 / 1194 / 1434
Регистрация: 29.08.2014
Сообщений: 4,373
22.11.2016, 02:46 17
Цитата Сообщение от Sergio Leone Посмотреть сообщение
смотри Тасование Фишера–Йетса - Генерация случайной перестановки последовательности чисел от 1 до N
у меня он и реализован

Добавлено через 11 минут
Цитата Сообщение от NIKOLAYY Посмотреть сообщение
Просто в мой код трудно с первого раза как бы въехать
да то-же самое что у Пытливый, и у меня, разница в том, что мы заранее перемешанный массив приготовили, а ты с ним работаешь по событию.

кстати, написано без защиты от ухода в минус - нажму я 101 раз и получу exception.
0
Sergio Leone
2467 / 1112 / 579
Регистрация: 07.06.2014
Сообщений: 3,259
22.11.2016, 22:03 18
Цитата Сообщение от Joy Посмотреть сообщение
у меня он и реализован
разве?! там же суть в том, что случайное число выбирается из числа оставшихся значений, а у тебя диапазон случайного числа не меняется:
Цитата Сообщение от Joy Посмотреть сообщение
Delphi
1
j:=random(1000)+9000;
да диапазон странный - от 9000 до 9999 ?!

я предлагал такой вариант:
Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
var
  a:array[1000..9999] of integer;
  N, i,j,t:integer;
begin
  randomize;
  for i:=1000 to 9999 do a[i]:=i;
 
 { перемешать массив }
 N := 9999-1000+1;
 for i:=1 to N-1 do
  begin
   j := Random(N-i+1)+i;
   if j <> i then  {обменяем местами элементы с номером i и j }
   begin
     t := a[i+999];
     a[i+999] := a[j+999];
     a[j+999] := t;
   end;
  end;
 
  {вывести результат на экран}
  for i:=1000 to 9999 do write(a[i]:5);
end.
0
northener
пофигист широкого профиля
3423 / 2323 / 630
Регистрация: 15.07.2013
Сообщений: 13,747
23.11.2016, 01:19 19
Цитата Сообщение от DenNik Посмотреть сообщение
предлагаю массив
a: array[1000..9999] of boolean;
System.Classes.TBits
0
Joy
Эксперт Pascal/Delphi
2163 / 1194 / 1434
Регистрация: 29.08.2014
Сообщений: 4,373
23.11.2016, 02:12 20
Цитата Сообщение от Sergio Leone Посмотреть сообщение
да диапазон странный - от 9000 до 9999 ?!
это не диапазон странный, это я торопливый.
0
23.11.2016, 02:12
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
23.11.2016, 02:12

Запрет на ввод чисел в EDIT, пока не будет заполнено другое поле edit
Здравствуйте! Дело в том, что мне нужно сделать так, чтобы одно поле edit...

Задача. Нужно вывести на форму такое кол-во Edit, сколько будет введено в Edit
Нужно вывести на форму такое кол-во Edit'ов, сколько будет введено в Edit. Я...

Написать программу, которая будет генерировать квадратную матрицу рандомно
Необходимо написать программу которая будет генерировать квадратную матрицур...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru