Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C++ Builder > Генератор случайных чисел.


Автор: KACATuK 21.11.2004, 20:26
Привет всем.
Я начал изучать С++, вот, добрался до того момента, когда мне понадобился генератор случайных чисел, но прикол в том, что у меня при каждом новом запуске проги rand() выдаёт одну и ту же последовательность случайных чисел, начинающих с одного и того же числа.

Вопрос, как новичку smile написать свою функцию для генерации случайного числа, что надо и КАК! smile

Заранее спасибо, и звиняйте за наивность, но я просто учусь smile

Автор: maxim1000 21.11.2004, 20:32
генератор случайных чисел работает следующим образом:
1. в начале работы происходит инициализация генератора
2. при каждом вызове над числом проводится некоторое преобразование
так вот для нормальной работы генератора нужно сначала инициализировать его, например, временем
Добавлено @ 20:33
генератор случайных чисел работает следующим образом:
1. в начале работы происходит инициализация генератора
2. при каждом вызове над числом проводится некоторое преобразование
так вот для нормальной работы генератора нужно сначала инициализировать его, например, временем
пример из MSDN:
Код

#include <stdlib.h>
#include <stdio.h>
#include <time.h>

void main( void )
{
  int i;

  /* Seed the random-number generator with current time so that
   * the numbers will be different every time we run.
   */
  srand( (unsigned)time( NULL ) );

  /* Display 10 numbers. */
  for( i = 0;   i < 10;i++ )
     printf( "  %6d\n", rand() );
}

Автор: KACATuK 21.11.2004, 20:42
Спасибо. Заработало.
Но, как я понял со своим корявым знанием английского, в stdio.h установлены какие-то пороговые значения для максимального и минимального значения случайного числа, если я не ошибаюсь, как мне их поменять?

Автор: JackYF 22.11.2004, 01:03
Работать со случайными числами надо так, например:

Код

#include <stdlib.h> //Если не ошибаюсь

void main()
{
  randomize;
  int x=random(100); //Выходит число от 0 до 99
}


Автор: Hroft 8.12.2004, 14:13
Если тебе нужны случайные числа из определенного интервала, то нужно масштабировать.
Например, у тебя есть сл. число из [0; b]. Тогда для получения сл. числа из [0; d] надо первое умножить на d/b.

Автор: Voker57 8.12.2004, 14:29
Цитата(JackYF @ 21.11.2004, 17:03)
Работать со случайными числами надо так, например:


Код 

#include <stdlib.h> //Если не ошибаюсь

void main()
{
  randomize;
  int x=random(100); //Выходит число от 0 до 99
}

Не, это уже что то из паскаля smile

Автор: legwar 4.2.2005, 21:11
Код

#include <stlib.h>
#include <stdio.h>
#include <time.h>
int main(void)
{
   int i;
   randomize();
   for (i=0; i<10;i++)
        printf("%d\n", rand() % 100);
   return 0;
}

Автор: cardinal 4.2.2005, 22:40
Цитата(Hroft @ 8.12.2004, 12:13)
Если тебе нужны случайные числа из определенного интервала, то нужно масштабировать.

Только аккуратно это делать надо, см.
http://forum.vingrad.ru/index.php?showtopic=40164

Автор: Fixin 4.2.2005, 23:31
Можно так:
Код
#include <stdlib.h>
#include <time.h>
inline int random(int __num) { return(int)(((long)rand()*__num)/(RAND_MAX+1)); }
inline void randomize(void) { srand((unsigned)time(NULL)); }

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

Автор: InfMag 5.2.2005, 06:21
Цитата(Voker57 @ 8.12.2004, 17:29)
Цитата(JackYF @ 21.11.2004, 17:03)
Работать со случайными числами надо так, например:


Код 

#include <stdlib.h> //Если не ошибаюсь

void main()
{
   randomize;
   int x=random(100); //Выходит число от 0 до 99
}

Не, это уже что то из паскаля smile

Работает, но рандомиз как таковой не действует... Сначала выдает 49, потом 4 и т.д. Причем всегда.

Автор: InfMag 5.2.2005, 19:01
Не понял! Куда делась моя мессага?
Вобщем:
Код

randomize();
int x=random(100);
ShowMessage(IntToStr(x));

Автор: nooob 30.3.2008, 10:36
хм а если  надо чтобы генератор был для двоичных чисел. ну и скажем 100 комбинаций  различных. чтобы дальше применить например манчестерский  код сделать быстрое преобразование Фурье и рассмотреть спектр получаемый

Автор: cardinal 30.3.2008, 15:13
nooob, а что десятичное число в двоичное преобразовать нельзя?

Автор: JackYF 30.3.2008, 23:15
некрофилы...

Автор: nooob 31.3.2008, 15:02
ну вот я парюсь. сказали чтобы выдавал  двоичные. подскажите пожалуйста

Автор: Invisible_kid 6.4.2008, 14:34
1) незнаю как у Вас) но у меня билдер работает так:
 есть randomize;  Randomize(); и Randomize; ) каторые, скажем так, выводят_,  как и у  всех нормальных людей, 49, 4, 86 и т.д. 
а есть   randomize(); [с маленькой буквы, и в канце са скобками, если кто вдруг не заметил)] 
и если ее вставить в ф-ии перед вызавом рандома, то значения палучаются другими
Код

void __fastcall TForm1::Button1Click(TObject *Sender)
{  randomize();
  int x;
 for (int i=0;i<=10;i++){
  x=random(100);
  Memo1->Lines->Add(IntToStr(x));
         };
}
//---------------------------------------------------------------------------

void __fastcall TForm1::Button2Click(TObject *Sender)
{randomize();
  int x;
 for (int i=0;i<=10;i++){
  x=random(100);
  Memo2->Lines->Add(IntToStr(x));
         };
}

тока это.... оно паходу па времени сморит, ибо если сделать так
Код

void __fastcall TForm1::Button1Click(TObject *Sender)
{  randomize();
  int x;
  x=random(100);
  Memo1->Lines->Add(IntToStr(x));
}

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


2)
nooob ,.... ну в билдере есть ф-я IntToHex() ....  виглядит примерно так вроде: 
Код

 int z=23;
 AnsiString s=IntToHex(z,2);
 ShowMessage(s);

...вроед есть и IntToBin()...... 
//ну еси что, мот проще бут из хекса в бин перевадить)))


Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)