Функция rand() (случайный выбор из определенных значений (C++))
Модератор: Модераторы разделов
-
Ardes
- Сообщения: 50
- ОС: Fedora Core GNU/Linux
Функция rand()
Существует ли способ сделать случайный выбор не из значений ограниченных масштабом, а из определенных пользователем значений?
Желательно, чтобы это реализовывалось с помощью функции rand().
Желательно, чтобы это реализовывалось с помощью функции rand().
-
nesk
- Сообщения: 2268
- Статус: Линукссаксовец
- ОС: MS Windows XP Home SP3
Re: Функция rand()
в чем проблема? у Вас есть массив значений определенных пользователем, с помощью rand() вы определяете номер элемента массива. Так?
Внимание: У меня под рукой нет машины с Linux. Я не использую эту ОС. Ответы я даю либо по памяти, либо мне помогает гугл. Тщательно читайте маны по тем командам и конфигурационным файлам, которые я упоминаю.
0xDEFEC8ED
0xDEFEC8ED
-
Ardes
- Сообщения: 50
- ОС: Fedora Core GNU/Linux
Re: Функция rand()
Как с помощью массивов это сделать я знаю) Просто задачка с применением такой фичи была в одной книге, но на момент прочтения массивы еще не должны быь изучены)) значит должно делаться как то по другому)
Вот задачка:
http://dpaste.com/hold/66081/
Вот задачка:
http://dpaste.com/hold/66081/
-
Hater
- Сообщения: 165
- ОС: Archlinux
-
nesk
- Сообщения: 2268
- Статус: Линукссаксовец
- ОС: MS Windows XP Home SP3
Re: Функция rand()
Ardes писал(а): ↑19.07.2008 20:29Как с помощью массивов это сделать я знаю) Просто задачка с применением такой фичи была в одной книге, но на момент прочтения массивы еще не должны быь изучены)) значит должно делаться как то по другому)
Вот задачка:
http://dpaste.com/hold/66081/
вы не видите разницу между своим вопросом и этой задачей??
в задаче даны три последовательности, притом далеко не случайные .
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
0xDEFEC8ED
-
Ardes
- Сообщения: 50
- ОС: Fedora Core GNU/Linux
Re: Функция rand()
А я решил по другому)) (Не без помощи сообщества)
http://dpaste.com/66093/
http://dpaste.com/66093/
-
nesk
- Сообщения: 2268
- Статус: Линукссаксовец
- ОС: MS Windows XP Home SP3
Re: Функция rand()
Ardes писал(а): ↑19.07.2008 21:40А я решил по другому)) (Не без помощи сообщества)
http://dpaste.com/66093/
фактически это то, что предлагал сделать Hater
думаю это не то решение, которым следует гордиться
и еще решение скорее всего не соотвествует заданию, там следовало использовать "единственный оператор", а не пять ифов
Внимание: У меня под рукой нет машины с Linux. Я не использую эту ОС. Ответы я даю либо по памяти, либо мне помогает гугл. Тщательно читайте маны по тем командам и конфигурационным файлам, которые я упоминаю.
0xDEFEC8ED
0xDEFEC8ED
-
Hater
- Сообщения: 165
- ОС: Archlinux
Re: Функция rand()
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()
Хотя да, так намного красивее!
-
DeKar
- Сообщения: 7
Re: Функция rand()
Hater писал(а): ↑19.07.2008 21:52Ardes писал(а): ↑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()
нет, намного красивее так:
Код:
#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
0xDEFEC8ED
-
Ardes
- Сообщения: 50
- ОС: Fedora Core GNU/Linux
Re: Функция rand()
но задача то состояла в том, чтобы написать оператор в одну строчку без применения функций и массивов)
Но все равно спасибо за содействие, учту и ваш вариант)
Но все равно спасибо за содействие, учту и ваш вариант)
-
nesk
- Сообщения: 2268
- Статус: Линукссаксовец
- ОС: MS Windows XP Home SP3
Re: Функция rand()
if и switch сами по себе являются операторами языка
в одну строчку, пожалуйста :
для случая c)
cout << 6 + 4 * (int)( 5.0 * (rand() / (RAND_MAX + 1.0))) << endl;
Внимание: У меня под рукой нет машины с Linux. Я не использую эту ОС. Ответы я даю либо по памяти, либо мне помогает гугл. Тщательно читайте маны по тем командам и конфигурационным файлам, которые я упоминаю.
0xDEFEC8ED
0xDEFEC8ED
-
Ardes
- Сообщения: 50
- ОС: Fedora Core GNU/Linux
Re: Функция rand()
Классно, но я немножко недопонял как она работает))
Обычно ведь в масштабировании указывают rand() % x, где икс ширина поля возвожных вариантов.
А у вас указано каким то новым для меня способом, объясните плиз, если вам не тяжело))
Обычно ведь в масштабировании указывают rand() % x, где икс ширина поля возвожных вариантов.
А у вас указано каким то новым для меня способом, объясните плиз, если вам не тяжело))
-
nesk
- Сообщения: 2268
- Статус: Линукссаксовец
- ОС: MS Windows XP Home SP3
Re: Функция rand()
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
0xDEFEC8ED
-
Ardes
- Сообщения: 50
- ОС: Fedora Core GNU/Linux
Re: Функция rand()
Вот теперь действительно Спасибо! Все, тему можно закрывать)