Рандомное число от 1 до 10
|
|
Deswing | Дата: Четверг, 15 Ноября 2012, 19:04 | Сообщение # 1 |
заслуженный участник
Сейчас нет на сайте
| Привет всем. Готовлюсь к олимпиаде, наткнулся на вопрос: а как лучше всего (подчеркиваю - ЛУЧШЕ, то есть оптимизирование, без лишней крутости) реализовать рандом? Есть задачка: дети тянут билеты из мешка деда мороза. Например играет два ребёнка: Миша и Влад. Влад вытянул число 5, а Миша - 3. Влад съест 2 конфеты (5-3=2). Очень парюсь по этому поводу. Потому что везде говорят подключать библиотеки, ну а я считаю, что подключать библиотеки нужно по-минимуму. Для меня самое главное - больше толку, меньше коду. Такая вот, в принципе, штукенция. В голову приходила мысль написать функцию - но не знаю уж, как это оценят на городской олимпиаде. В любом случае нуждаюсь в помощи. Спасибо за внимание, жду ответов (очень сильно выручите, если поможете )
|
|
| |
aalla | Дата: Четверг, 15 Ноября 2012, 22:40 | Сообщение # 2 |
постоянный участник
Сейчас нет на сайте
| вроде почти взрослый), а лезешь на форум игростороя для того чтоб узнать о такой чепухе(я не знаю реализацию на c++, но думаю она не на много отличается от других языков, и не думаю что гугл прячет от тебя этот секрет тоже.)
|
|
| |
ShadowZi | Дата: Четверг, 15 Ноября 2012, 23:04 | Сообщение # 3 |
постоянный участник
Сейчас нет на сайте
| рандом с++ выдаёт число от 0 до 1
поэтому чтобы получить в нужном нам диапазоне то надо так (не помню точно команду на рандом поэтому пусть будет rand) 1+rand()*9 в итоге получим число от одного до 10. Если нужны целые только то округляем.
|
|
| |
Deswing | Дата: Четверг, 15 Ноября 2012, 23:13 | Сообщение # 4 |
заслуженный участник
Сейчас нет на сайте
| aalla, понимаю) Гугл - вещь. Искал, находил. Но рандом реализуется везде по-разному, поэтому и спросил - как актуальнее. ShadowZi, int a = 1+rand()*9; выдал мне число 370. Причём выдаёт это число всегда. Что здесь может быть не так? Code #include <iostream> #include <Windows.h> using namespace std; int main() { setlocale( LC_ALL, "Russian" ); float a = 1+rand()*9; cout<<a; system("PAUSE");
return 0; }
|
|
| |
ShadowZi | Дата: Четверг, 15 Ноября 2012, 23:35 | Сообщение # 5 |
постоянный участник
Сейчас нет на сайте
| То что всегда это нормально, вначале в с++ инициализировать надо счётчик случайных чисел. Как уже не помню. Иначе выдаёт одни и те же числа(вернее одну и ту же последовательность чисел). Проблема в том что под раздными IDE он по разному инициализируется, в биулдере к примеру достаточно просто Randomize.
а вот на счёт диапазона я лопухнулся) С++совский выдаёт значения от 0 до 99(посмотрел в справочнике), те получается чтобы получить наше надо такую формулу сделать 1+rand()*9/100Добавлено (15.11.2012, 23:35) --------------------------------------------- srand ( time(NULL) ); там же откопал инициализацию
Сообщение отредактировал ShadowZi - Четверг, 15 Ноября 2012, 23:34 |
|
| |
aalla | Дата: Четверг, 15 Ноября 2012, 23:36 | Сообщение # 6 |
постоянный участник
Сейчас нет на сайте
| как же все запущено в этом c++)), интересно для чего сделана такая реализация чисел?
|
|
| |
ShadowZi | Дата: Четверг, 15 Ноября 2012, 23:38 | Сообщение # 7 |
постоянный участник
Сейчас нет на сайте
| Quote (aalla) интересно для чего сделана такая реализация чисел? Чтобы на её основе можно было получить любое нужное тебе распределение. будешь учить теорвер поймёшь. Формулами можно перейти от равномерного распределения стандартного рандома к любому другому распределению - пуассона или куче других, без подключения доп библиотек. Ну и вот такие диапазонные задачи получаются достаточно неплохо)
|
|
| |
IgnisFatuus | Дата: Пятница, 16 Ноября 2012, 08:22 | Сообщение # 8 |
частый гость
Сейчас нет на сайте
| Посоны! Не запускаите ето вируссс!!11 Винду распи?:%;№(ло, пишу с линукса.. Ой, я форумом ошибся...
Хотя пишу и правда с линукса...
[/code]
#include <iostream> #include <Windows.h> #include <stdlib.h> using namespace std;
int main() {
setlocale( LC_ALL, "Russian" );
srand( time(NULL) ); float a = 1+rand()%9; cout<<a; system("PAUSE");
return 0; }
[code]
Норм, не?
И зачем тебе локаль? Где ты символы выводишь кирилицей? К тому же погугли - я под винду давно не писал - сетлокаль можно задавать не для всего, а только для отдельных параметров(это я к тому что обезьяны в жюри могут докопаться).
Сообщение отредактировал IgnisFatuus - Пятница, 16 Ноября 2012, 08:32 |
|
| |
MrAkakuy | Дата: Пятница, 16 Ноября 2012, 09:46 | Сообщение # 9 |
участник
Сейчас нет на сайте
| Deswing,а слабо зайти вот сюда а?
|
|
| |
Deswing | Дата: Пятница, 16 Ноября 2012, 23:46 | Сообщение # 10 |
заслуженный участник
Сейчас нет на сайте
| что не так?
А без подключения библиотек (кроме iostream) можно как-то написать генератор случайных чисел в оределенном диапазоне?
|
|
| |
RUNGOGET2THECHOPAH | Дата: Суббота, 17 Ноября 2012, 00:00 | Сообщение # 11 |
участник
Сейчас нет на сайте
| #include <time.h>
|
|
| |
Deswing | Дата: Суббота, 17 Ноября 2012, 00:43 | Сообщение # 12 |
заслуженный участник
Сейчас нет на сайте
| Code #include <iostream> #include <time.h>
using namespace std;
int main() { srand(time(0)); cout<<1+rand()%10; getchar(); return 0; } работает отлично! А как-то избавиться от библиотеки time.h возможно для создания рандома?Добавлено (17.11.2012, 00:38) ---------------------------------------------
Quote (Deswing) Есть задачка: дети тянут билеты из мешка деда мороза. Например играет два ребёнка: Миша и Влад. Влад вытянул число 5, а Миша - 3. Влад съест 2 конфеты (5-3=2). решил так (о да, знаю, код из разряда "ЧТОЗАФИГНЯ"): Code #include <iostream> #include <time.h>
using namespace std;
int Vlad, Vova;
int main() { srand(time(0)); while(true) { cout<<"Press 'ENTER'"<<'\n'; getchar(); Vlad=1+rand()%10; Vova=1+rand()%10; cout<<"Vlad = "<<Vlad<<'\n'; cout<<"Vova = "<<Vova<<'\n'; if (Vlad==Vova) { cout<<Vova<<" = "<<Vlad<<", no fun :("<<'\n'; } if (Vlad>Vova) { cout<<"VLAD WIN!!!"<<'\n'<<Vlad<<"-"<<Vova<<"="<<Vlad-Vova<<'\n'; } if (Vlad<Vova) { cout<<"VOVA WIN!!!"<<'\n'<<Vova<<"-"<<Vlad<<"="<<Vova-Vlad<<'\n'; } } return 0; } что-то в нём не так? Есть косяки? Или ошибки грубые в оформлении?Добавлено (17.11.2012, 00:43) ---------------------------------------------
Quote (Deswing) ошибки грубые в оформлении? int main() - ведь не ошибка?
Просто мне кто-то однажды сказал, что я программирую "под старину". Типа подход к программированию устарелый
|
|
| |
TovTripleZ | Дата: Суббота, 17 Ноября 2012, 10:51 | Сообщение # 13 |
Злая ящерка >:3
Сейчас нет на сайте
| Quote (ShadowZi) рандом с++ выдаёт число от 0 до 1 Ну... вообще-то от 0 до 65535. Quote (Deswing) Типа подход к программированию устарелый Потому что в окошках никто не запускает программы из командной строки, и значение, возвращаемое функцией main, всё равно никуда не попадёт. Это не то чтобы очень устарелый подход, просто сейчас им редко пользуются. Quote (Deswing) А как-то избавиться от библиотеки time.h возможно для создания рандома? Если у тебя есть другой источник гарантированно отличающихся чисел, можешь использовать его... но у тебя его нет.
Quote (Deswing) А без подключения библиотек (кроме iostream) можно как-то написать генератор случайных чисел в оределенном диапазоне? Генерация последоватльности случайных чисел - очень трудная математическая задача. Готовые алгоритмы наверняка существуют, но зачем тебе это, если есть библиотечные функции?
Бледные дрыщекролики следят за вами
|
|
| |
Deswing | Дата: Суббота, 17 Ноября 2012, 14:16 | Сообщение # 14 |
заслуженный участник
Сейчас нет на сайте
| Quote (TovTripleZ) К тому же, time.h - не библиотека, а заголовочный файл. Извините ради бога, действительно глупость сказал Quote (TovTripleZ) Генерация последоватльности случайных чисел - очень трудная математическая задача. Готовые алгоритмы наверняка существуют, но зачем тебе это, если есть библиотечные функции? для олимпиады. По условию олимпиады там нужно подключать как можно меньше библиотек и заголовочных файлов. Вот и интересуюсь Вот, кстати, сделал программу (дискриминант ищет и говорит, боль ли он равен нулю или нет): Code #include <iostream> #include <math.h> int main(){ double a,b,c; while(true) { std::cout<<'\n'; std::cin >> a >> b >> c; std::cout << (b*b-4*a*c>=0?"True,":"False,"); std::cout << b*b-4*a*c; std::cout << b*b-4*a*c << " = " << sqrt(b*b-4*a*c); std::cout<<'\n'; } return 0; } есть какие-нибудь замечания?
Меня просто ЯП никто не учил... Я сам по себе, поэтому много где могут быть ужаснейшие ошибки... Но я надеюсь, что меня прокритикуют и укажут на недочёты (пускай программки и простые)
Сообщение отредактировал Deswing - Суббота, 17 Ноября 2012, 14:17 |
|
| |
kikas86 | Дата: Суббота, 17 Ноября 2012, 22:48 | Сообщение # 15 |
постоянный участник
Сейчас нет на сайте
| Quote (Deswing) есть какие-нибудь замечания? Можешь, что бы не писать каждый раз облако std перед cout и cin: можно после директив написатьCode using namespace std; и будет легче) Кстати зачем ты используешь тут цикл?
Услуги создания сайтов, верстки сайтов. Своя CMS, свой движок.
Сообщение отредактировал kikas86 - Суббота, 17 Ноября 2012, 22:50 |
|
| |
RUNGOGET2THECHOPAH | Дата: Суббота, 17 Ноября 2012, 23:03 | Сообщение # 16 |
участник
Сейчас нет на сайте
| Quote (Deswing) std::cout << (b*b-4*a*c>=0?"True,":"False,"); И еще, баг - если дискриминант получился отрицательным, то программа все равно пытается взять от него корень. И да, с точки зрения оптимизации лучше посчитать дискриминант один раз и записать значение в переменную, а не считать его каждый раз, когда оно понадобится. Добра и удачи.
Сообщение отредактировал RUNGOGET2THECHOPAH - Суббота, 17 Ноября 2012, 23:04 |
|
| |
Deswing | Дата: Понедельник, 19 Ноября 2012, 00:00 | Сообщение # 17 |
заслуженный участник
Сейчас нет на сайте
| Quote (RUNGOGET2THECHOPAH) Что ж ты делаешь-то? а что не так? )) Картинка улыбает
|
|
| |
hero564 | Дата: Пятница, 23 Ноября 2012, 23:15 | Сообщение # 18 |
Made in Ukraine
Сейчас нет на сайте
| Deswing, просто добавь сразу после #include <iostream> это: using namespace std;(подключает пространство имен) и можно будет всегда писать не а просто и так далее
|
|
| |