Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Генерация случайных чисел

500
27 февраля 2002 года
waste
26 / / 20.04.2000
На форме висит кнопка и метка. Объявляю массив на пять элементов и переменную для генератора

AnsiString city[5]={„Москва“, „Уфа“, „Челябинск“, „Омск“, „Киев“ };
Int gen;

Теперь в событие clickButton пишу

srand(time(NULL));
gen=0+rand()%5;
Label1->Caption=city[gen];

Что в результате будет выводить случайным образом содержимое элементов массива.
Проблема в том ,что вывод элементов может повторяться, типа
Москва
Уфа
Челябинск
Омск
Уфа

Хотелось бы, что бы программа выводила все элементы случайно, но без повтора.
Что можно сделать ?
545
27 февраля 2002 года
Посторонний
74 / / 20.05.2000
Цитата:

On 2002-02-26 2341, waste wrote
На форме висит кнопка и метка. Объявляю массив на пять элементов и переменную для генератора

AnsiString city[5]={„Москва“, „Уфа“, „Челябинск“, „Омск“, „Киев“ };
Int gen;

Теперь в событие clickButton пишу

srand(time(NULL));
gen=0+rand()%5;
Label1->Caption=city[gen];

Что в результате будет выводить случайным образом содержимое элементов массива.
Проблема в том ,что вывод элементов может повторяться, типа
Москва
Уфа
Челябинск
Омск
Уфа

Хотелось бы, что бы программа выводила все элементы случайно, но без повтора.
Что можно сделать ?


Ну, вообще-то самый верный способ - поискать проверенный алгоритм генерации случайного числа.
Можно и самому чего-нить придумать. Например, брать десятые доли секунды текущего времени
А некоторые современные материнские платы имеют встроенные генераторы.

289
27 февраля 2002 года
Jeyson
207 / / 20.04.2000
Лови прогу с пылу с жару. Написано мож и коряво, но пашет как надо. Если чего не так пиши. Лучше это дело в билдера загнать там читабельнее. А все просмотреть и понять алгоритмику хорошо в процессе отладки.
С наилучшими пожеланиями.

//---------------------------------------------------------------------------
// Программа одноразовой выборки города из списка, состоящего из пяти городов
// Использование структур
// Автор Jeyson он же Евгений
// Version 1.0
// Дата разработки 27.02.02
// Время разработки 0ч.30мин. (из них 10 мин написания комментария)
// Никакие права не защищены, пользуйтесь кто хочет, буду только рад.
// Мой e-mail [EMAIL]jeyson@mail.ru[/EMAIL]
//---------------------------------------------------------------------------
#include <vcl.h>
#pragma hdrstop
#include <stdlib.h>

#include &quot;Unit1.h&quot;
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource &quot;*.dfm&quot;
TForm1 *Form1;
int gen;
struct city{
AnsiString name; // имя города
int index; // ==0, если данный город не выбирался, ==1 в противном случае
};
struct city masCity[5]; // массив структур

// данная функция призвана проверять все ли города перибраны
// или нет. Иначе зависнем
bool Proverka(struct city masCity[])
{
for (int k=0;k<5;k++)
if(masCity[k].index==0)
{
return true; // если есть хотя бы один не занятый индекс
}
return false; // если все индексы заняты
}

//---------------------------------------------------------------------------
__fastcall TForm1TForm1(TComponent* Owner)
TForm(Owner)
{
// забиваем массив структуры
masCity[0].name=&quot;Москва&quot;;
masCity[1].name=&quot;Уфа&quot;;
masCity[2].name=&quot;Челябинск&quot;;
masCity[3].name=&quot;Омск&quot;;
masCity[4].name=&quot;Киев&quot;;
for(int i=0;i<5;i++)
{
masCity.index=0; // все города НЕ выбраны ни разу
}
}
//---------------------------------------------------------------------------

void __fastcall TForm1Button1Click(TObject *Sender)
{
L1 gen=random(5);// эта функция нагляднее (случай из пяти)
if(!masCity[gen].index) // если город не выбирался - пишем в метку
Label1->Caption=masCity[gen].name;
else
if (Proverka(masCity))goto L1; /*иначе, если есть не выбранные города
повторим еще раз случайный выбор. Можно на метку и не уходить, но при
этом будут происходить пустые нажатия кнопки (сам посуди города выб-
раны, допустим не все, а данный город уже выбирался , поэтому
ждемс следующего нажатия батона - вдруг повезет )*/

masCity[gen].index=1;// ну и конечно же надо пометить данный город как выбранный
}
//---------------------------------------------------------------------------
500
01 марта 2002 года
waste
26 / / 20.04.2000
[/quote]
Благодоря Джейсону додумался сам до альтернативного решения своей проблемы с массивами, а точнее с безповторным выводом элементов. Ниже следует код на чистом С++, который без труда можно перенести на Билдер (у меня это заняло не больше пяти минут).


#include <iostream.h>
#include <stdlib.h>
#include <time.h>
main()
{
srand(time(NULL)); //Числа генерируються по системному времени
int gen;
int mas[10]={11,22,33,44,55,66,77,88,99,111};
int check[10]={0}; // массив-проверка забиваеться нулями, что означает, элемент не юзался
int count=0; //счетчик для избежания зависания
cout<<&quot;Random digits are &quot;;
for (int i=0;i<=10;i++)
{
l gen=0+rand()%10; // генерим число
if (check[gen]==0) // если элемент равен нулю, то значит ок, выводим его на экран
{
check[gen]=1; и присваиваем ему один, что бы больше не использовать текущий элемент
cout<<&quot; &quot;<<mas[gen];
count++;
}
else
{
while (count!=10)
goto l;
}
}
}

Основной принцип конечно взят у Джейсона, но я избежал использования функции и структуры (тяжело мне с ними общаться ()
Может кому понадобиться мой код )
Доброго вам траффика господа-кодеры !

[ Это Сообщение было отредактировано waste в 2002-03-01 0004 ]
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог