Генерация случайных чисел
AnsiString city[5]={„Москва“, „Уфа“, „Челябинск“, „Омск“, „Киев“ };
Int gen;
Теперь в событие clickButton пишу
srand(time(NULL));
gen=0+rand()%5;
Label1->Caption=city[gen];
Что в результате будет выводить случайным образом содержимое элементов массива.
Проблема в том ,что вывод элементов может повторяться, типа
Москва
Уфа
Челябинск
Омск
Уфа
Хотелось бы, что бы программа выводила все элементы случайно, но без повтора.
Что можно сделать ?
Цитата:
On 2002-02-26 2341, waste wrote
На форме висит кнопка и метка. Объявляю массив на пять элементов и переменную для генератора
AnsiString city[5]={„Москва“, „Уфа“, „Челябинск“, „Омск“, „Киев“ };
Int gen;
Теперь в событие clickButton пишу
srand(time(NULL));
gen=0+rand()%5;
Label1->Caption=city[gen];
Что в результате будет выводить случайным образом содержимое элементов массива.
Проблема в том ,что вывод элементов может повторяться, типа
Москва
Уфа
Челябинск
Омск
Уфа
Хотелось бы, что бы программа выводила все элементы случайно, но без повтора.
Что можно сделать ?
Ну, вообще-то самый верный способ - поискать проверенный алгоритм генерации случайного числа.
Можно и самому чего-нить придумать. Например, брать десятые доли секунды текущего времени
А некоторые современные материнские платы имеют встроенные генераторы.
С наилучшими пожеланиями.
//---------------------------------------------------------------------------
// Программа одноразовой выборки города из списка, состоящего из пяти городов
// Использование структур
// Автор 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 "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
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="Москва";
masCity[1].name="Уфа";
masCity[2].name="Челябинск";
masCity[3].name="Омск";
masCity[4].name="Киев";
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;// ну и конечно же надо пометить данный город как выбранный
}
//---------------------------------------------------------------------------
Благодоря Джейсону додумался сам до альтернативного решения своей проблемы с массивами, а точнее с безповторным выводом элементов. Ниже следует код на чистом С++, который без труда можно перенести на Билдер (у меня это заняло не больше пяти минут).
#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<<"Random digits are ";
for (int i=0;i<=10;i++)
{
l gen=0+rand()%10; // генерим число
if (check[gen]==0) // если элемент равен нулю, то значит ок, выводим его на экран
{
check[gen]=1; и присваиваем ему один, что бы больше не использовать текущий элемент
cout<<" "<<mas[gen];
count++;
}
else
{
while (count!=10)
goto l;
}
}
}
Основной принцип конечно взят у Джейсона, но я избежал использования функции и структуры (тяжело мне с ними общаться ()
Может кому понадобиться мой код )
Доброго вам траффика господа-кодеры !
[ Это Сообщение было отредактировано waste в 2002-03-01 0004 ]