Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Общие вопросы > Случайные числа


Автор: Rondo 11.5.2006, 15:26
есть 4 случайных числа в диапозоне 1..9, как сделать чтобы они были случайными но их сумма была равна допустим 27?

например 
9981 = 27
6489= 27
 smile 
 

Автор: _hunter 11.5.2006, 15:36
создай массив таких чисел (сумма цифр в котором == 27) и выбирай число из этого массива.
 

Автор: Yanis 11.5.2006, 15:47
Вот Delphi то под рукой нету... 4 раза отнимай от 27 числа из диапозона от 1 до 9, к одному из 4-х чисел прибавить разность 27 и 4-х найденых... Вроде ничего не напутал smile 

Автор: Guedda 11.5.2006, 15:51
Код

type
  Tmass = 1..9;

begin
  Randomize;
  a := random(TMass);
  b := random(TMass);
  c := random(TMass);
  d := random(TMass);
  if (a + b + c + d) = 27 then {твои операторы};
end;
 

Автор: Ripper 11.5.2006, 16:00
Код

var
a:array [0..3] of integer;
i,sum:integer;
begin
sum:=27;
randomize;
repeat
 for i:=0 to 3 do
  a[i]:=random(9);
   until ((a[0]+a[1]+a[2]+a[3])=sum) ;
end;


Типа того т.е. пока не будет равно 27 запомлять эти случайные числа
 

Автор: _hunter 11.5.2006, 16:08
а вас (обоих) не смущает то, что в худшем случае этот цикл несколько лет выполняться будет? 

Автор: Alexeis 11.5.2006, 16:17
_hunter, код Ripper у меня сработал за несколько итераций!

Добавлено @ 16:19 
У Guedda, явно опечатка (даже не компилируется) 

Автор: Yanis 11.5.2006, 16:32
Цитата(alexeis1 @  11.5.2006,  17:17 Найти цитируемый пост)
_hunter, код Ripper у меня сработал за несколько итераций!

Всё равно это не выход. Нужно генерировать, а не подбирать. 

Автор: Rondo 11.5.2006, 16:39
Мне надо чтобы он сразу выкидывал числа суммой 27 smile 

Автор: Yanis 11.5.2006, 16:41
Цитата(Rondo @  11.5.2006,  17:39 Найти цитируемый пост)
Мне надо чтобы он сразу выкидывал числа суммой 27

см. post 3 

Автор: _hunter 11.5.2006, 16:43
alexeis1, -- повезло smile

Rondo, засунь код в функцию -- будет сразу выкидывать 

Автор: Rondo 11.5.2006, 17:30
Спасибо Yanis, твой способ помог  smile 
Вот что получилось:

Код

procedure TForm1.Button1Click(Sender: TObject);
const
  num = 27;
var
  a, b, c, d, sum, minus: integer;
begin
  randomize;
  a:= random(9);
  b:= random(9);
  c:= random(9);
  d:= random(9);
  sum:= a+b+c+d;
  minus:= num-sum;
  d:=d+minus;
  edit1.Text:= IntToStr(a)+' '+IntToStr(b)+' '+IntToStr(с)+' '+IntToStr(d);
  edit2.Text:= IntToStr(a+b+c+d);
end; 
   

Автор: Snowy 11.5.2006, 17:41
Ндя. Способ не очень.
Так и вижу результат 1 + 1 + 1 + 24

Добавлено @ 17:42 
Даже простой перебор и то приличней.
Код

repeat 
  a:= random(9);    
  b:= random(9);    
  c:= random(9);    
  d:= random(9);
until a + b + c + d = 27;
 

Автор: Rondo 11.5.2006, 17:43
Да, я только что хотел об этом спросить smile Как сделать чтобы последнее число (d) если >10 то оно как то распределилось в другие?  smile  

Автор: Yanis 11.5.2006, 17:55
Цитата(Snowy @  11.5.2006,  18:41 Найти цитируемый пост)
Так и вижу результат 1 + 1 + 1 + 24

А что этот вариант не подходит под условие? 

Автор: Rondo 11.5.2006, 17:56
Нужен не перебор а ген.

Добавлено @ 17:57 
Цитата(Yanis @ 11.5.2006,  17:55)
Цитата(Snowy @  11.5.2006,  18:41 Найти цитируемый пост)
Так и вижу результат 1 + 1 + 1 + 24

А что этот вариант не подходит под условие?

Подходит! Считает все прально но надо как то число d разбросать по другим числам 

Автор: Yanis 11.5.2006, 17:59
а ну да  smile  

Автор: Yanis 11.5.2006, 18:32
Можно построить таблицу со значениями. Всего лишь 216 значений при данных условях smile 

Автор: Rondo 11.5.2006, 18:37
Может есть какието другие способы? 

Автор: Yanis 11.5.2006, 18:48
Цитата(Yanis @  11.5.2006,  19:32 Найти цитируемый пост)
построить таблицу со значениями
 

Автор: Ripper 11.5.2006, 20:08
незнаю у меня все быстро вычислялось т.к. числа не большие и перебор идет быстро
 

Автор: Vit 11.5.2006, 20:49
Так чуток побыстрее будет

Код

repeat 
  a:= random(9);    
  b:= random(9);    
  c:= random(9);    
until a + b + c >17;
d:=27-a-b-c;



 

Автор: Cheburek 12.5.2006, 00:42
Код

type
nabor = record
      a,b,c,d:array[1..217] of integer;
end;
{....}
var my:nabor;

1 раз так
Код

procedure TForm1.Button1Click(Sender: TObject);
var i,j,m,n,k : integer;
begin
k := 1;
for i := 1 to 9 do begin 
    for j := 1 to 9 do begin
        for n := 1 to 9 do begin
            for m := 1 to 9 do begin
                if m+n+j+i = 27 then begin
                    my.a[k] := i;
                    my.b[k] := j;
                    my.c[k] := n;
                    my.d[k] := m;
                    k := k + 1;
                end;
            end;
        end;
    end;
end;
end;

а потом все время вот так
Код

Randomize;
k := random(217);
label1.Caption := inttostr(my.a[k]) + '  ' 
+ inttostr(my.b[k]) + '  ' 
+ inttostr(my.c[k]) + '  '
+ inttostr(my.d[k]) + '  ';


а вообще по условию самое нормальное...    

Автор: Romikgy 12.5.2006, 09:34
Код

procedure TForm1.Button1Click(Sender: TObject);
function sumdec(const x: longint): longint;
var t: longint;
begin
  t:=x;
  Result:=t mod 10;
  t:=t div 10;
  Result:= Result+ (t mod 10);
  t:=t div 10;
  Result:= Result+ (t mod 10);
  t:=t div 10;
  Result:= Result+ (t mod 10);
end;
var  sl: TStringList;
i: longint;
begin
 sl:=TStringList.Create;
 for i:=1000 to 9999 do
 begin
  if (sumdec(i)=27) then sl.Add(IntToStr(i));
 end;
 ListBox1.Items.Assign(sl);
 ListBox1.Items.Insert(0,IntToStr(sl.Count));
 sl.Free;
end;

Всего 219 таких комбинаций smile 
и потом можно по рандому выводить нужную строку из листбокса smile 

Автор: Демо 12.5.2006, 09:43
Если одно число зависит от других, то оно не является случайным, что противоречит условиям задачи. 

Автор: Демо 12.5.2006, 10:00
Метод Guedda вполне подходит, и итераций достаточно немного для поиска:

Вот пара десятков решений этим методом, последнее число - количество итераций:

9    4    7    7    Ит:    42
9    2    8    8    Ит:    20
8    6    9    4    Ит:    2
8    9    5    5    Ит:    6
6    9    4    8    Ит:    11
5    7    9    6    Ит:    39
8    9    8    2    Ит:    49
7    9    8    3    Ит:    63
6    5    9    7    Ит:    37
9    8    3    7    Ит:    38
8    7    5    7    Ит:    13
8    7    8    4    Ит:    61
7    5    9    6    Ит:    16
9    5    7    6    Ит:    5
6    8    5    8    Ит:    8
6    6    7    8    Ит:    59
6    6    6    9    Ит:    3
7    7    7    6    Ит:    17
6    8    9    4    Ит:    7
7    8    6    6    Ит:    28
9    3    9    6    Ит:    41
7    9    7    4    Ит:    10
8    4    9    6    Ит:    46
9    8    8    2    Ит:    52
9    6    3    9    Ит:    56
9    7    6    5    Ит:    13
7    8    4    8    Ит:    3
4    9    7    7    Ит:    32
8    3    9    7    Ит:    12
7    8    8    4    Ит:    3
8    9    5    5    Ит:    10
8    4    9    6    Ит:    45
4    8    8    7    Ит:    16
7    7    8    5    Ит:    27
2    8    8    9    Ит:    2
4    7    7    9    Ит:    11
6    9    9    3    Ит:    24
1    8    9    9    Ит:    11
3    6    9    9    Ит:    61
6    6    8    7    Ит:    8
7    8    3    9    Ит:    1
6    6    7    8    Ит:    4
7    8    5    7    Ит:    10
6    9    6    6    Ит:    16
4    9    6    8    Ит:    25
7    6    8    6    Ит:    1
1    8    9    9    Ит:    10
7    9    7    4    Ит:    67
7    5    6    9    Ит:    31
9    4    8    6    Ит:    14
6    9    8    4    Ит:    58
9    7    9    2    Ит:    14
4    8    8    7    Ит:    20
9    6    7    5    Ит:    21
6    9    5    7    Ит:    2
8    2    9    8    Ит:    89
8    9    1    9    Ит:    8
2    9    9    7    Ит:    17
3    6    9    9    Ит:    32
9    9    7    2    Ит:    21
9    9    3    6    Ит:    32
7    9    9    2    Ит:    44
3    9    7    8    Ит:    12
5    7    6    9    Ит:    30
6    7    7    7    Ит:    4
5    9    4    9    Ит:    5
9    8    3    7    Ит:    29
 

Автор: Alexeis 12.5.2006, 10:22
Демо, Полностью согласен вычитание портит "случайность"
Если вычитать так хоть выбирать чило из которого вычитаем произвольно или раскидывать вычитаемое число на всех(в смысле вычитать из каждого некоторое число чтоб сумма сохранялась) 

Автор: Guedda 12.5.2006, 10:52
Цитата(Демо @  12.5.2006,  11:00 Найти цитируемый пост)
Метод Guedda вполне подходит

Хм... Ну тогда и пользоваться этим методом. 

Автор: Alexeis 12.5.2006, 10:58
Guedda, может для Демо и подходит но автор (Rondo) говорит, что ему этот способ не годится.
Цитата(Rondo @  11.5.2006,  16:56 Найти цитируемый пост)
Нужен не перебор а ген.

 

Автор: Guedda 12.5.2006, 11:01
Хм... Так это как раз таки не перебор, а генерация случайных чисел... Функцией random... 

Автор: Rondo 12.5.2006, 13:13
норма, я если че делаю пока такой... простенький key-gen  smile

Добавлено @ 13:13 
Хотя я его реализовал... но всетаки для себя интересно как все это делается smile 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)