Функция rand() (случайный выбор из определенных значений (C++))

Модератор: Модераторы разделов

Ardes
Сообщения: 50
ОС: Fedora Core GNU/Linux

Функция rand()

Сообщение Ardes »

Существует ли способ сделать случайный выбор не из значений ограниченных масштабом, а из определенных пользователем значений?
Желательно, чтобы это реализовывалось с помощью функции rand().
Спасибо сказали:
Аватара пользователя
nesk
Сообщения: 2268
Статус: Линукссаксовец
ОС: MS Windows XP Home SP3

Re: Функция rand()

Сообщение nesk »

Ardes писал(а):
19.07.2008 19:57
Существует ли способ сделать случайный выбор не из значений ограниченных масштабом, а из определенных пользователем значений?
Желательно, чтобы это реализовывалось с помощью функции rand().

в чем проблема? у Вас есть массив значений определенных пользователем, с помощью rand() вы определяете номер элемента массива. Так?
Внимание: У меня под рукой нет машины с Linux. Я не использую эту ОС. Ответы я даю либо по памяти, либо мне помогает гугл. Тщательно читайте маны по тем командам и конфигурационным файлам, которые я упоминаю.

0xDEFEC8ED
Спасибо сказали:
Ardes
Сообщения: 50
ОС: Fedora Core GNU/Linux

Re: Функция rand()

Сообщение Ardes »

Как с помощью массивов это сделать я знаю) Просто задачка с применением такой фичи была в одной книге, но на момент прочтения массивы еще не должны быь изучены)) значит должно делаться как то по другому)
Вот задачка:
http://dpaste.com/hold/66081/
Спасибо сказали:
Аватара пользователя
Hater
Сообщения: 165
ОС: Archlinux

Re: Функция rand()

Сообщение Hater »

Ну можно ещё через switch-case, но это уже не красиво.
last.fm user Hater-X
Спасибо сказали:
Аватара пользователя
nesk
Сообщения: 2268
Статус: Линукссаксовец
ОС: MS Windows XP Home SP3

Re: Функция rand()

Сообщение nesk »

Ardes писал(а):
19.07.2008 20:29
Как с помощью массивов это сделать я знаю) Просто задачка с применением такой фичи была в одной книге, но на момент прочтения массивы еще не должны быь изучены)) значит должно делаться как то по другому)
Вот задачка:
http://dpaste.com/hold/66081/

вы не видите разницу между своим вопросом и этой задачей?? :crazy:

в задаче даны три последовательности, притом далеко не случайные .
a) пять четных чисел от 2 до 10
b) пять нечетных чисел от 3 до 11
c) последовательность пяти чисел от 6 до 22 с шагом 4

в любом случае мы получаем случайное число в диапазоне от 0 до 4 а дальше
а) 2 + (случайное число в диапазоне от 0 до 4)*2
b) 3 + (случайное число в диапазоне от 0 до 4)*2
c) 6 + (случайное число в диапазоне от 0 до 4)*4

вот как то так
Внимание: У меня под рукой нет машины с Linux. Я не использую эту ОС. Ответы я даю либо по памяти, либо мне помогает гугл. Тщательно читайте маны по тем командам и конфигурационным файлам, которые я упоминаю.

0xDEFEC8ED
Спасибо сказали:
Ardes
Сообщения: 50
ОС: Fedora Core GNU/Linux

Re: Функция rand()

Сообщение Ardes »

А я решил по другому)) (Не без помощи сообщества)
http://dpaste.com/66093/
Спасибо сказали:
Аватара пользователя
nesk
Сообщения: 2268
Статус: Линукссаксовец
ОС: MS Windows XP Home SP3

Re: Функция rand()

Сообщение nesk »

Ardes писал(а):
19.07.2008 21:40
А я решил по другому)) (Не без помощи сообщества)
http://dpaste.com/66093/

фактически это то, что предлагал сделать Hater

думаю это не то решение, которым следует гордиться :)
и еще решение скорее всего не соотвествует заданию, там следовало использовать "единственный оператор", а не пять ифов :ph34r:
Внимание: У меня под рукой нет машины с Linux. Я не использую эту ОС. Ответы я даю либо по памяти, либо мне помогает гугл. Тщательно читайте маны по тем командам и конфигурационным файлам, которые я упоминаю.

0xDEFEC8ED
Спасибо сказали:
Аватара пользователя
Hater
Сообщения: 165
ОС: Archlinux

Re: Функция rand()

Сообщение Hater »

Ardes писал(а):
19.07.2008 21:40
А я решил по другому)) (Не без помощи сообщества)
http://dpaste.com/66093/

Кривовато. Для таких вещей и существует оператор switch-case. Решение задачи одним оператором:
switch(rand()%5)
{
case 0:
cout<<a[0]<<endl;
break;
case 1:
cout<<a[1]<<endl;
break;
/*......*/
}
last.fm user Hater-X
Спасибо сказали:
Ardes
Сообщения: 50
ОС: Fedora Core GNU/Linux

Re: Функция rand()

Сообщение Ardes »

Хотя да, так намного красивее!
Спасибо сказали:
DeKar
Сообщения: 7

Re: Функция rand()

Сообщение DeKar »

Hater писал(а):
19.07.2008 21:52
Ardes писал(а):
19.07.2008 21:40
А я решил по другому)) (Не без помощи сообщества)
http://dpaste.com/66093/

Кривовато. Для таких вещей и существует оператор switch-case. Решение задачи одним оператором:
switch(rand()%5)
{
case 0:
cout<<a[0]<<endl;
break;
case 1:
cout<<a[1]<<endl;
break;
/*......*/
}

case тут лишний

Код: Выделить всё

cout<<a[rand()%5]<<endl;
Спасибо сказали:
Аватара пользователя
nesk
Сообщения: 2268
Статус: Линукссаксовец
ОС: MS Windows XP Home SP3

Re: Функция rand()

Сообщение nesk »

Ardes писал(а):
19.07.2008 22:09
Хотя да, так намного красивее!

нет, намного красивее так:

Код:

#include <iostream> #include <stdlib.h> #include <time.h> using namespace std; int randseq(int first, int step, int len); main() { srand(time(NULL)); cout << "a)" << randseq(2,2,5) << endl; cout << "b)" << randseq(3,2,5) << endl; cout << "c)" << randseq(6,4,5) << endl; return 0; } int randseq(int first, int step, int len){ return first + step * (int)( (float)len * (rand() / (RAND_MAX + 1.0))); }
Внимание: У меня под рукой нет машины с Linux. Я не использую эту ОС. Ответы я даю либо по памяти, либо мне помогает гугл. Тщательно читайте маны по тем командам и конфигурационным файлам, которые я упоминаю.

0xDEFEC8ED
Спасибо сказали:
Ardes
Сообщения: 50
ОС: Fedora Core GNU/Linux

Re: Функция rand()

Сообщение Ardes »

но задача то состояла в том, чтобы написать оператор в одну строчку без применения функций и массивов)
Но все равно спасибо за содействие, учту и ваш вариант)
Спасибо сказали:
Аватара пользователя
nesk
Сообщения: 2268
Статус: Линукссаксовец
ОС: MS Windows XP Home SP3

Re: Функция rand()

Сообщение nesk »

Ardes писал(а):
19.07.2008 22:34
но задача то состояла в том, чтобы написать оператор в одну строчку без применения функций и массивов)
Но все равно спасибо за содействие, учту и ваш вариант)

if и switch сами по себе являются операторами языка :crazy:
в одну строчку, пожалуйста :

для случая c)

cout << 6 + 4 * (int)( 5.0 * (rand() / (RAND_MAX + 1.0))) << endl;
Внимание: У меня под рукой нет машины с Linux. Я не использую эту ОС. Ответы я даю либо по памяти, либо мне помогает гугл. Тщательно читайте маны по тем командам и конфигурационным файлам, которые я упоминаю.

0xDEFEC8ED
Спасибо сказали:
Ardes
Сообщения: 50
ОС: Fedora Core GNU/Linux

Re: Функция rand()

Сообщение Ardes »

Классно, но я немножко недопонял как она работает))
Обычно ведь в масштабировании указывают rand() % x, где икс ширина поля возвожных вариантов.
А у вас указано каким то новым для меня способом, объясните плиз, если вам не тяжело))
Спасибо сказали:
Аватара пользователя
nesk
Сообщения: 2268
Статус: Линукссаксовец
ОС: MS Windows XP Home SP3

Re: Функция rand()

Сообщение nesk »

Ardes писал(а):
19.07.2008 22:55
Классно, но я немножко недопонял как она работает))
Обычно ведь в масштабировании указывают rand() % x, где икс ширина поля возвожных вариантов.
А у вас указано каким то новым для меня способом, объясните плиз, если вам не тяжело))


http://www.opennet.ru/man.shtml?topic=rand...3&russian=0


В книге Numerical Recipes in C: The Art of Scientific Computing (William H. Press, Brian P. Flannery, Saul A. Teukolsky, William T. Vetterling; New York: Cambridge University Press, 1992 (2nd ed., p. 277)) даны следующие комментарии:

"Если Вы желаете получить случайное число в промежутке от 1 до 10, Вы всегда должны использовать старшие биты, например:

j=1+(int) (10.0*rand()/(RAND_MAX+1.0));

не следует выполнять такое действие:

j=1+(rand() % 10);

(т.е. использовать младшие биты)."
Внимание: У меня под рукой нет машины с Linux. Я не использую эту ОС. Ответы я даю либо по памяти, либо мне помогает гугл. Тщательно читайте маны по тем командам и конфигурационным файлам, которые я упоминаю.

0xDEFEC8ED
Спасибо сказали:
Ardes
Сообщения: 50
ОС: Fedora Core GNU/Linux

Re: Функция rand()

Сообщение Ardes »

Вот теперь действительно Спасибо! Все, тему можно закрывать)
Спасибо сказали: