Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: Случайное число на Си  (Прочитано 29061 раз)
0 Пользователей и 1 Гость смотрят эту тему.
max
Гость
« : 04-09-2006 19:59 » 

Всем привет. Помогите написать программу на Си генерирующую случайные числа.(ну, хоть пример несложный на Си, как эту функцию rand() использовать, а то не могу понять... Не надо)
Записан
RXL
Технический
Администратор

Offline Offline
Пол: Мужской

WWW
« Ответ #1 : 04-09-2006 20:24 » 

max, что непонятно? Рассказывай.
Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
max
Гость
« Ответ #2 : 04-09-2006 21:25 » 

Ну, совсем непонятно... сначала я попытался так:
Код:
#include <stdio.h>
#include <stdlib.h>
int main(void) {
    int x;
    x = rand();
    printf("%d\n",x);
    return 0;
}
Но этот вариант не прошел. Потом я залез в файл stdlib.h(я туда впервые полез Меня одолевают смутные сомнения) и увидел там:
Код:
_CRTIMP int __cdecl	rand	(void);
_CRTIMP void __cdecl srand (unsigned int);
Посмотрел и ничего не понял... что за "_CRTIMP int __cdecl"? Насколько я понимаю функции ничего передавать не надо, но и возвращает она не случайное число...(я уже попытался в коде выше и постоянно получаю число 41).
Я там еще увидел srand(), но она ничего не возвращает...(получаю ошибку: error: void value not ignored as it ought to be). А черт его знает...
Записан
Джон
просто
Администратор

de
Offline Offline
Пол: Мужской

« Ответ #3 : 04-09-2006 21:36 » 

max, на самом деле всё очень просто - случайных чисел в копьютере не бывает. Правильно их называть - псевдослучайные.
Те числа получаемые по определённому алгоритму. Чтобы внести случайность - необходимо алгоритм инициаллизировать определённым образом. Например, используя некоторую величину, которая не будет повторяться. В большинстве случаев используется значение текущего времени. Для инициаллизации генератора псевдослучайных чисел и служит ф-я srand. Добавь вот эти строчки в код и всё должно заработать.

#include <stdio.h>
#include <stdlib.h>
#include <time.h>
int main(void)
{
   DWORD nStartValue = time(NULL);
   srand(nStartValue);

    int x;
    x = rand();
    printf("%d\n",x);
    return 0;
}

Записан

Я вам что? Дурак? По выходным и праздникам на работе работать. По выходным и праздникам я работаю дома.
"Just because the language allows you to do something does not mean that it’s the correct thing to do." Trey Nash
"Physics is like sex: sure, it may give some practical results, but that's not why we do it." Richard P. Feynman
"All science is either physics or stamp collecting." Ernest Rutherford
"Wer will, findet Wege, wer nicht will, findet Gründe."
Finch
Спокойный
Администратор

il
Offline Offline
Пол: Мужской
Пролетал мимо


« Ответ #4 : 04-09-2006 21:41 » 

Ну если до конца раскрывать вопрос, вот ссылка на FAQ форума https://forum.shelek.ru/index.php/topic,8668.msg128858.html#msg128858
Цитата
Посмотрел и ничего не понял... что за "_CRTIMP int __cdecl"?
__cdecl это определитель функции. Говорит компилятору по какому принципу надо строить функцию и как к ней обрашаться. Т.е как передаются параметры в функцию, кто освобождает стэк. С _CRTIMP я не встречался, но думаю что также макрос определитель функции.
« Последнее редактирование: 04-09-2006 21:48 от Finch » Записан

Не будите спашяго дракона.
             Джаффар (Коша)
Finch
Спокойный
Администратор

il
Offline Offline
Пол: Мужской
Пролетал мимо


« Ответ #5 : 04-09-2006 22:05 » 

Совсем недавно такую таблицу видел
соглашениепорядок помещения параметров в стеккто очищает стек
_cdeclобратныйвызывающий
_stdcallобратныйпроцедура
_fastcallзависит от компиляторапроцедура
_pascalпрямойпроцедура
Записан

Не будите спашяго дракона.
             Джаффар (Коша)
max
Гость
« Ответ #6 : 04-09-2006 22:11 » 

Ого, спасибо всем! Особенно Джону за код! Улыбаюсь) Только у меня компилятор не воспринял DWORD, и я его заменил на int... вроде работает.
Код:
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
int main(void)
{
    int nStartValue = time(NULL);
    srand(nStartValue);
    printf("%d\n",rand() % 100);
    return 0;
}
Записан
max
Гость
« Ответ #7 : 04-09-2006 22:14 » 

Совсем недавно такую таблицу видел
соглашениепорядок помещения параметров в стеккто очищает стек
_cdeclобратныйвызывающий
_stdcallобратныйпроцедура
_fastcallзависит от компиляторапроцедура
_pascalпрямойпроцедура
Спасибо, но мне это не понятно... это наверно макросы?(у меня они дальше по учебнику рассматриваются... еще не дочитал)
Записан
max
Гость
« Ответ #8 : 04-09-2006 22:16 » 

...но думаю что также макрос определитель функции.
значит макросы... Улыбаюсь
Записан
Dimka
Деятель
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #9 : 05-09-2006 07:26 » 

Цитата: max
у меня компилятор не воспринял DWORD, и я его заменил на int...
В данном случае не важно, поэтому можно int, а вообще unsigned int. Улыбаюсь
Записан

Программировать - значит понимать (К. Нюгард)
Невывернутое лучше, чем вправленное (М. Аврелий)
Многие готовы скорее умереть, чем подумать (Б. Рассел)
npak
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #10 : 05-09-2006 14:30 » new

_cdecl,_stdcall - не макросы.  Это ключевые слова расширения языка Си, реализованного в компиляторах фирмы Майкрософт.  Эти ключевые слова указывают компилятору, как помещать аргументы в стек при вызове функции и как восстанавливать стек после вызова.
Записан

UniTesK -- индустриальная технология надежного тестирования.

http://www.unitesk.com/ru/
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines