Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 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
6-49662
BlackSun
2003-11-15 11:04
2004.01.16
SSL


3-49406
Rem
2003-12-18 17:11
2004.01.16
Снятие аттрибута ReadOnly с полей в TClientDataSet


1-49552
A. Sonin
2004-01-05 21:50
2004.01.16
Эффективный способ предотвращения запуска второго экземпляра


1-49569
Alik
2004-01-05 19:58
2004.01.16
как бмп проявить


6-49661
BelAS
2003-11-14 07:08
2004.01.16
Обновление по сети





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский