Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2004.01.16;
Скачать: CL | DM;

Вниз

масвсив случайных чисел   Найти похожие ветки 

 
_Mad_   (2004-01-05 13:08) [0]

помогите мне плиз в прпограмме надо использовать массив из случайных чисел пробую сделать при помощи ramdom() но появляется куча одинаковых элементов а надо чтобы значание каждого элемента был в единственном экземпляре. по моему надо делать какуюто проверку но вот какую?


 
Тимохов ©   (2004-01-05 13:10) [1]

Думаю, что у меня Ramdom дал бы ошибку компиляции...

А вот Random работает нормально...

Запоминайте раннее выданные числа - и заставляйте random работать столько пока не будет новое число.


 
[lamer]Barmaglot ©   (2004-01-05 13:12) [2]

Randomize сделать не забыл?


 
default ©   (2004-01-05 13:13) [3]

какого диапазона надо случайные числа генерить?


 
_Mad_   (2004-01-05 13:20) [4]

default: каждый раз по разному грубо говоря от 2 до n-1 во как


 
[lamer]Barmaglot ©   (2004-01-05 13:23) [5]

Приведи свой неработающий код


 
_Mad_   (2004-01-05 13:30) [6]

c[1]:=inttostr(random(n-1));
for i:=2 to n-1 do
begin
l1: t:=random(n-1);
for j:=2 to i do
begin
if c[j-1]<>inttostr(t) then
begin
c[j]:=inttostr(t);
end
else
begin
goto l1;
end;
end;
end;

мне кажется что он должен выглядеть так но при его выполнении машина зависает:(


 
YuRock ©   (2004-01-05 13:37) [7]


const
RAND_COUNT = 5;
RAND_MAX = 100;
var
a: Array[1..RAND_COUNT] of Integer;

function FillRandArray: Boolean;
i, j, nCur: Integer;
bNew: Boolean;
begin
Result := False;
if RAND_MAX < RAND_COUNT - 1 then Exit;

i := 1;
while i <= RAND_COUNT do begin
bNew := True;
nCur := Random(RAND_MAX);
for j := 1 to i - 1 do if a[j] = nCur then begin
bNew := False;
Break;
end;

if bNew then a[i] := nCur
else Continue;

i := i + 1;
end;

Result := True;
end;


Но сначала прямо в файле проекта, перед "Application.Initialize;", надо обязательно написать "Randomize;".


 
default ©   (2004-01-05 13:40) [8]

если от 2 до n-1, то это
Random(n-2) + 2
и где здесь проверка на повторяемость случайных чисел?
(типа они для этого где-то сохраняться должны)


 
ssk   (2004-01-05 13:41) [9]

Вот делал когда-то для доминошного пасьянса (ненужное выкинул).

pole - наш рабочий массив
Memo - добавлен просто для визуализации


procedure TForm1.FormCreate(Sender: TObject);
begin
randomize;
end;

procedure TForm1.Button1Click(Sender: TObject);
var
i, p: integer;
pole: array[1..28] of byte;
begin
for i:=1 to 28 do
pole[i]:=0; // обнуляем массив
for i:=1 to 28 do // начинаем перебор ячеек
repeat
p:=0;
while p=0 do
p:=random(29); // получаем случайное число, отличное от "0"
if pole[p]=0 then // если ячейка p свободна, то
begin
pole[p]:=i; // заносим счетчик-значение i в массив
Memo1.Lines.Add(IntToStr(p)); // Memo добавлен для наглядности
end;
until pole[p]=i;
end;


Думаю, разобраться будет несложно. Переделаешь под свои нужды.


 
YuRock ©   (2004-01-05 13:43) [10]

> _Mad_ (05.01.04 13:30) [6]

А зависает потому, что тяжело найти ошибку в коде, в котором есть goto! Что-то с алгоритмом не то, попробуй мой.


 
default ©   (2004-01-05 13:43) [11]

ssk (05.01.04 13:41) [9]
а если диапазон генерации к примеру типа Cardinal ?


 
_Mad_   (2004-01-05 13:48) [12]

за код конечно спасибо но мне надо чтобы он генерировал максимум двузначные цифры


 
YuRock ©   (2004-01-05 13:54) [13]

> _Mad_ (05.01.04 13:48) [12]

Тогда в варианте [7] присвой RAND_MAX = 99;


 
_Mad_   (2004-01-05 13:57) [14]

все разобрался признаю кот хороший и цифры какие надо генерит


 
default ©   (2004-01-05 14:00) [15]

_Mad_ (05.01.04 13:48) [12]
он и генерирует такие)


 
ssk   (2004-01-05 14:10) [16]

>default © (05.01.04 13:43) [11]

>ssk (05.01.04 13:41) [9]
>а если диапазон генерации к примеру типа Cardinal ?

Я привел пример алгоритма реализации случайных неповторяющихся чисел в массиве - не более.


 
_Mad_   (2004-01-05 14:16) [17]

а скажите что и куда надо добавить в код YuRock чтобы он исключал 0 и 1???


 
Lucifer ©   (2004-01-05 14:19) [18]

http://delphibase.endimus.com/?action=viewfunc&topic=matharray&id=10472


 
default ©   (2004-01-05 14:20) [19]

nCur := Random(RAND_MAX - 2) + 2
генерятся числа от 2 до RAND_MAX - 1


 
YuRock ©   (2004-01-05 14:22) [20]

> _Mad_ (05.01.04 14:16) [17]

..?..

Замени в моем коде все слова "Random(RAND_MAX)" на "Random(RAND_MAX) + 2".


 
default ©   (2004-01-05 14:29) [21]

Lucifer © (05.01.04 14:19) [18]
"SetLength(bm,length(inputMass));"
bm принимает размер числа случайных чисел, которые надо получить
"result:=random(range);
while flag[result]"
(flag=bm)
result типа Integer
вот это обращение flag[result] законно?



Страницы: 1 вся ветка

Текущий архив: 2004.01.16;
Скачать: CL | DM;

Наверх




Память: 0.51 MB
Время: 0.018 c
1-49551
mik_1
2004-01-01 22:29
2004.01.16
Application.ProcessMessages


4-49801
_Andrew_
2003-11-10 16:04
2004.01.16
Загрузка файла из ресурса


9-49383
Плохой человек
2003-06-17 16:09
2004.01.16
Так в чём же всё-таки писать аркады?..


1-49626
MagaSoft
2004-01-03 22:29
2004.01.16
Директория


1-49593
Toots
2004-01-05 12:56
2004.01.16
параметр командной строки