Модераторы: Daevaorn

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> (C++) srand(time(0)), генератор случайных чисел 
:(
    Опции темы
Natalka
Дата 7.12.2006, 19:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 21
Регистрация: 7.12.2006
Где: Днепродзержинск

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



Здравствуйте!Может,кто знает,как сделать так,чтобы выведенные генератором случайных чисел числа были выведены только один раз и не повторялись?
PM MAIL WWW   Вверх
mr.Anderson
Дата 7.12.2006, 19:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


iOS Lead Developer
****


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

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



пропиши в начале кода randomize(); .


--------------------
user posted image

user posted image
PM MAIL ICQ Skype   Вверх
Dray
Дата 7.12.2006, 21:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Материалист
**


Профиль
Группа: Участник
Сообщений: 652
Регистрация: 7.10.2003
Где: г. Всеволожск

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



Код

srand( (unsigned)time( NULL ) );
rand();

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


--------------------
忍者

user posted image
PM MAIL   Вверх
mr.Anderson
Дата 7.12.2006, 21:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


iOS Lead Developer
****


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

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



Dray, просто в учебниках обычно пишут именно srand( time( 0 ) );. По своему опыту знаю.


--------------------
user posted image

user posted image
PM MAIL ICQ Skype   Вверх
Natalka
Дата 7.12.2006, 22:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 21
Регистрация: 7.12.2006
Где: Днепродзержинск

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



randomize() не работает

Я делаю в Visual C++


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

Нужно исключить повторение чисел.

#include "stdafx.h"
#include <ctime>
using namespace std;
void main()
{
    srand(time(0));
    const int n=10;
 int a[n];
 cout<<"Chisla ot 1 Do 10 :"<<endl;
  for (int i=0; i<n; i++)
  {
      a[i]=rand()%10+1;
      cout<<a[i]<<endl;
  }
}



PM MAIL WWW   Вверх
Невермайнд
Дата 7.12.2006, 22:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



А ты пропиши что  если такое число есть то ренд еще раз
PM MAIL ICQ   Вверх
Partizan
Дата 8.12.2006, 07:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Let's do some .NET
****


Профиль
Группа: Модератор
Сообщений: 2828
Регистрация: 19.12.2005
Где: Санкт-Петербург

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



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

есть много разных вариантов как можно эту задачу вообще рещить...


--------------------
СУВ,
       Partizan.
PM MAIL WWW ICQ Skype GTalk Jabber   Вверх
Dov
Дата 8.12.2006, 09:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


аСинизатор
***


Профиль
Группа: Завсегдатай
Сообщений: 1721
Регистрация: 10.5.2003
Где: Эрец-Исраэль

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



Код
void main()
{
    srand(time(0));
    const int n = 10;
    int       a[n];
    int       i, j, temp;

    for (i = 0; i < n; i++)
        a[i] = i + 1;

    cout << "Chisla ot 1 Do 10: " << endl;
    for (i = 0; i < n; i++)
    {
        j = rand() % n;
        temp = a[i];
        a[i] = a[j];
        a[j] = temp;
    }

    for (i = 0; i < n; i++)
        cout << a[i] << " ";

    cout<<endl;
}



--------------------
Тут вечности запах томительный,
И свежие фрукты дешевые, 
А климат у нас – изумительный, 
И только соседи – #уевые. 
                           Игорь Губерман.
PM   Вверх
Kuvaldis
Дата 8.12.2006, 10:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


механик-вредитель
***


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

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



В одной умной книжке видел следующую мысль:
ситуация, когда повторяются псевдослучайные числа, называется "неопределенная задержка"
Если нужно получить все из диапазона,  то очень возможен неприятный вариант с очень большим количеством повторений (10000 - диапазон, и нужно получить например, или 2 или 4, остальное выбрано)
На сей случай предлагается такое решение. Без кода, идея:
1. заводим отсортированный массив (это недостаток, но все же) чисел диапазона
2. Генерируем число Е на  шаге K
3. Совершаем ПЕРЕСТАНОВКУ элементов массива (Е, К)

Степень "тасованности" массива в таком случае можно ограничивать количеством итераций (шагов)

P.S. Достаточно эффективно я это когда-то использовал при моделировании раздачи карт в игре (они должны быть все разные, и за приемлемое время).Неприятно, когда сидишь 2 минуты и ждешь, когда сдадут предпоследнюю карту smile 

Это сообщение отредактировал(а) Kuvaldis - 8.12.2006, 11:08


--------------------
Помни - когда ты спишь, враг не дремлет
Спи чаще и дольше, изматывай врага бессоницей
PM MAIL ICQ   Вверх
Kuvaldis
Дата 8.12.2006, 11:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


механик-вредитель
***


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

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



Не, я еще не выздоровел: промахнулся глазом мимо поста Dov  smile 


--------------------
Помни - когда ты спишь, враг не дремлет
Спи чаще и дольше, изматывай врага бессоницей
PM MAIL ICQ   Вверх
Mayk
Дата 8.12.2006, 12:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


^аВаТаР^ сообщение>>
****


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

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



Цитата(Dov @  8.12.2006,  13:40 Найти цитируемый пост)
    for (i = 0; i < n; i++)
    {
        j = rand() % n;
        temp = a[i];
        a[i] = a[j];
        a[j] = temp;
    }

[/quote]
можно заменить на std::random_shuffle(a,a+n);
Эффект - тот же, но рандом_шаффл пишеться в одну строчку





--------------------
 Здесь был кролик. Но его убили.
Человеки < кроликов, йа считаю.
PM MAIL WWW ICQ   Вверх
V.A.KeRneL
  Дата 11.12.2006, 01:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Vadim A. Kazantsev
**


Профиль
Группа: Участник
Сообщений: 291
Регистрация: 3.12.2006
Где: Moscow, Russia

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



Цитата(Mayk @ 8.12.2006,  12:31)
std::random_shuffle(a,a+n);

Если бы мог, сделал бы Mayk'у ++ ))
Имхо, это именно то, что надо!
Узнал про ещё один «вкусный» метод C++
Усилилась и без того немалая радость от предвкушения того, что в следущем семестре наконец-то буду учить «Плюс»! smile

Добавлено @ 01:47 
Цитата(Mayk @ 8.12.2006,  12:31)
Эффект - тот же, но рандом_шаффл пишеться в одну строчку

Эффект, может и тот же, но: 
1) во-первых, random_shuffle действительно пишеться в одну строчку; 
2) во-вторых, он, наверняка, быстрее работает, т.к. содержится в стандартной библиотеке, а значит всячески оптимизирован; 
3) ну и в-третьих, так писать вообще плохо: 
Код

j = rand() % n;

Об этом во вех манах написано!..
Надо так: 
Код

j = (int) (((double) n) * rand() / (RAND_MAX + 1.0));



Это сообщение отредактировал(а) V_A_KeRneL - 11.12.2006, 04:45


--------------------
«C'est un pense-creux d'ici. C'est le meilleur et le plus irascible homme du monde...» © Ф.М. Достоевский, «Бесы»
---/)/)---(\.../)---(\(\
--(':'=)---(=';'=)---(=':')
(")(")..)-(").--.(")-(..(")(")

PM MAIL IM ICQ AOL YIM MSN   Вверх
JackYF
Дата 11.12.2006, 16:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


полуавантюрист
****


Профиль
Группа: Участник
Сообщений: 5814
Регистрация: 28.8.2004
Где: страна тысячи озё р

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



Цитата(V_A_KeRneL @  11.12.2006,  01:34 Найти цитируемый пост)
j = (int) (((double) n) * rand() / (RAND_MAX + 1.0));


Я думаю, что это наверное, правильней, но нужно его куда-нибудь в макрос или инлайн-функцию... Выглядит ужасно.

Добавлено @ 16:04 
И, кстати, работает медленней, что иногда тоже не самый последний фактор.


--------------------
Пожаловаться на меня как модератора можно здесь.
PM MAIL Jabber   Вверх
vinter
Дата 11.12.2006, 16:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Explorer
****


Профиль
Группа: Завсегдатай
Сообщений: 2735
Регистрация: 1.4.2006
Где: Н.Новгород

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



Цитата

3) ну и в-третьих, так писать вообще плохо: 

код C++    
1:    
j = rand() % n;    

Об этом во вех манах написано!..

это написано совершенно нормально и правильно, а вот это
Код

j = (int) (((double) n) * rand() / (RAND_MAX + 1.0));

изврат
к тому же double тут вообще не причем, rand возвращает целое число..


--------------------
Мой блог
PM MAIL WWW   Вверх
JackYF
Дата 11.12.2006, 17:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


полуавантюрист
****


Профиль
Группа: Участник
Сообщений: 5814
Регистрация: 28.8.2004
Где: страна тысячи озё р

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



vinter, 
Цитата(vinter @  11.12.2006,  16:37 Найти цитируемый пост)
это написано совершенно нормально и правильно, а вот это


Код

j = rand() % n;  

Будет работать неверно, если n > RAND_MAX.

А так как RAND_MAX на поверку (у меня) оказался не слишком большим (сколько точно - не помню), то некоторый смысл есть.

а double там, наверное, действительно не нужен... да и скобок многовато:
Код

j = n * ( rand() / (RAND_MAX + 1.0) );


Смотрится гораздо лучше.


--------------------
Пожаловаться на меня как модератора можно здесь.
PM MAIL Jabber   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

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

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


 




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


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

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