Форум: "Основная";
Текущий архив: 2004.01.16;
Скачать: [xml.tar.bz2];
Внизмасвсив случайных чисел Найти похожие ветки
← →
_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;
Скачать: [xml.tar.bz2];
Память: 0.48 MB
Время: 0.011 c