Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Случайное число из массива 
V
    Опции темы
ZIFIR
Дата 8.3.2006, 01:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 129
Регистрация: 8.3.2006

Репутация: нет
Всего: нет



Как из массива mas[]={1,2,3...} выбрать случайное число (random) и записать в переменную.
PM MAIL   Вверх
DeadSoul
Дата 8.3.2006, 01:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник
Сообщений: 1217
Регистрация: 25.9.2005
Где: Москва

Репутация: нет
Всего: 11



Код

int number=rand()%( sizeof(mas)/sizeof(mas[0]));

// mas[number] записывай куда хочешь


Это сообщение отредактировал(а) DeadSoul - 8.3.2006, 01:12


--------------------
 Если Вы получили ответ на Ваш вопрос, то нажмите на "Вопрос решен". 

Бьем спамеров их же оружием. Пусть весь спам сыпется им
[email protected] 
PM   Вверх
ZIFIR
Дата 8.3.2006, 01:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 129
Регистрация: 8.3.2006

Репутация: нет
Всего: нет



Спасибо за ответ. Работает даже так: num = random(sizeof(mas)/sizeof(mas[0]));
Но только я не могу понять как это происходит. Если не трудно объясните. И закроем тему.
PM MAIL   Вверх
BreakPointMAN
Дата 8.3.2006, 02:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 725
Регистрация: 15.9.2004
Где: Saratov

Репутация: 6
Всего: 24



Цитата

Функции генерации псевдослучайных чисел


Осуществляют генерацию последовательностей псевдослучайных чисел


Заголовочные файлы stdlib.h, System.hpp, Math.hpp

Синтаксис

#include <stdlib.h>
long _lrand(void);
int rand(void);
int random(int num);
void randomize(void);
void srand(unsigned seed);

#include <System.hpp>
extern PACKAGE void __fastcall Randomize(void);

#include <Math.hpp>
extern PACKAGE Extended __fastcall RandG(
                  Extended Mean, Extended StdDev);


Описание

Функция rand возвращает целые псевдослучайные числа, равномерно распределенные в диапазоне от 0 до RAND_MAX (0x7FFFU - 32767). Длина отрезка апериодичности псевдослучайных чисел 2^32 = 4 294 967 296. Число используемых случайных чисел не должно превышать эту величину. Если вам все-таки требуется больше чисел, то вы должны при приближении к границе отрезка апериодичности (а лучше задолго до нее) обновить последовательность чисел с помощью функций randomize или srand.

Если желательно генерировать случайные числа, лежащие в диапазоне от 0 до некоторого значение N, то это легко делать операцией вычисления остатка %. Например, выражение

rand() % 101

возвращает числа в диапазоне от 0 до 100, а выражение

(rand() % 201) - 100

возвращает числа в диапазоне от -100 до 100.

Функцию rand можно использовать и для генерации действительных случайных чисел. Например, выражение

10. * rand() / RAND_MAX

генерирует псевдослучайные действительные числа, распределенные в диапазоне от 0 до 10.

Функция _lrand работает аналогично функции rand, но имеет больший отрезок апериодичности - 2^64 и диапазон от 0 до 2^31 - 1.

Функция random отличается от предыдущих тем, что имеет параметр num, определяющий верхнюю границу диапазона генерируемых чисел. Поэтому, если надо, например, генерировать целые числа в диапазоне от 0 до 100, это можно сделать выражением

random(101);

не прибегая, как для предыдущих функций, к операции %.

Функция RandG генерирует квазислучайные действительные числа, распределенные по нормальному закону (закону Гаусса) с математическим ожиданием Mean и средним квадратичным отклонением StdDev.

Поскольку генерируемые рассматриваемыми функциями числа являются псевдослучайными, то при каждом новом запуске вашего приложения будет вырабатываться одна и та же последовательность чисел. Это удобно в процессе отладки. Однако, в законченном приложении это во многих случаях недопустимо. Чтобы избежать этого, надо рандомизировать генератор чисел, т.е. задавать ему каждый раз новое случайное исходное число. Рандомизацию всех генераторов, кроме RandG, осуществляет функция randomize. Достаточно вставить где-то в текст программы (например, в событие OnCreate формы) оператор

randomize();

чтобы при каждом запуске приложения генерировалась новая последовательность чисел.

Функция srand отличается от randomize тем, что задает в качестве начального не случайное число, а значение своего параметра seed.
Рандомизацию генератора RandG осуществляет функция Randomize, аналогичная randomize. Задание конкретного начального числа для этого генератора можно осуществить, задавая значение целой переменной RandSeed, определенной в файле System.hpp.




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

Если массив определен следующим образом:
Код

...
int array[]={1,2,3,4,5,6,7};
...

или
Код

...
int array[7];
...

...то его размерность можно определить с помощью операции sizeof:

"sizeof(array)" вернет кол-во байт, занимаемое всем массивом, а "sizeof(array[0])" вернет кол-во байт, занимаемое одним элементом массива. Следовательно, поделив первое на второе, получим размерность массива. Надо отметить, что таким образом нельзя определить размерность массива, созданного динамически:
Код

...
int *array=new array[7];
...
delete []array;
...

...ибо array здесь - это переменная типа int*, т.е. указатель, и sizeof, примененная к нему, вернет размер не выделенной области памяти операцией new, а размер, занимаемый самим указателем (например, 4 байта).




Вариант DeadSoul:
Код

int number=rand()%( sizeof(mas)/sizeof(mas[0]));
// mas[number] записывай куда хочешь

Функция rand() вернет псевдослучайное число в диапазоне от 0 до RAND_MAX.
Операция взятия остатка от целочисленного деления "%", примененная к этому числу со вторым аргументом, равным размерности массива, даст целое значение, лежащее в пределах от 0 (включая 0) до размерности массива (не включая число, равное размерности массива).
Таким образом, ты получишь свой случайный индекс.

Это сообщение отредактировал(а) BreakPointMAN - 8.3.2006, 02:44


--------------------
"Разруха не в клозетах, а в головах." © Ф.Ф. Преображенский (М.Булгаков, "Собачье сердце")
PM WWW ICQ   Вверх
BreakPointMAN
Дата 8.3.2006, 02:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 725
Регистрация: 15.9.2004
Где: Saratov

Репутация: 6
Всего: 24



Твой вариант:
Код

num = random(sizeof(mas)/sizeof(mas[0]));

Функция random вернет опять-таки индекс, который ты затем должен будешь использовать при обращении к массиву, ибо параметр этой функции - число, являющееся верхней границей диапазона генерируемых чисел, нижняя - 0.



Таким образом, потом, как получил индекс, обращаешься через него к элементу массива:




Код

int t1=mas[num]; // для варианта твоего
int t2=mas[number]; // для варианта DeadSoul



--------------------
"Разруха не в клозетах, а в головах." © Ф.Ф. Преображенский (М.Булгаков, "Собачье сердце")
PM WWW ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++ Builder"
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по С++ Builder обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Настоятельно рекомендуем заглянуть в DRKB (Delphi Russian Knowledge Base) - крупнейший в рунете сборник материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Rrader.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C++ Builder | Следующая тема »


 




[ Время генерации скрипта: 0.0494 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.