Часовой пояс: UTC + 3 часа




Начать новую тему Новая тема / Ответить на тему Ответить  Сообщений: 1730 • Страница 61 из 87<  1 ... 58  59  60  61  62  63  64 ... 87  >
  Пред. тема | След. тема 
В случае проблем с отображением форума, отключите блокировщик рекламы
Автор Сообщение
 

Member
Статус: Не в сети
Регистрация: 15.08.2007
time_t - unsigned int обычно (но в современных VS это макрос представляющий 64бит / 32бит в зависимости от настроек, для точного указания разрядности есть __time_32 и __time_64), устанавливать srand(time(NULL)) стандартная рекомендация, чтобы генератор выдавал при каждом запуске разные значения.

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



Партнер
 

Member
Статус: Не в сети
Регистрация: 15.02.2009
Откуда: Лангепас
progn`у
hub писал(а):
...выдает значения жестко привязанные ко времени. arr_size_f убывает на единицу в секунду, например во время первого запуска arr_size_f == 0.98, второго 0.97, третьего 0.95. Разница значений зависит не от номера пуска, а от времени прошедшего с последнего запуска. Компилятор борландовский (C++ Builder 6.0)
У gcc с тем же кодом значение arr_size_f наоборот, растет, только гораздо медленнее...


Проблема в реализации rand(). srand(time(NULL)) инициализирует последовательными значениями... а вот как ведёт себя первое значение rand(), при возрастающих значениях seed`а - это зависит от конкретного алгоритма rand(). Думаю проще использовать srand(time(NULL)*17), где 17 - любое простое число (не 1 конечно ;) )


 

Member
Статус: Не в сети
Регистрация: 15.08.2007
oxy
почему именно простое число? помоему надежнее действительно, брать следующее случайное, т.е. делать лишний rand(), там функция посложнее чем просто умножение на число.


 

Member
Статус: Не в сети
Регистрация: 15.02.2009
Откуда: Лангепас
тоже вариант, Тут, я думаю на усмотрение программиста. Простое - что бы более случайный srand() вышел без перекрытий по множителям.
Как-то смотрел на rand() в BC 3.1 - формула простая, но с подбором коэффициентов - они "попотели", как высчитывали - не понятно.


 

Member
Статус: Не в сети
Регистрация: 25.08.2005
Откуда: SPb
Всем большое спасибо, это действительно "вина" компиляторов, на другом компе код собранный борландовским компилятором вел себя так же. Проверил у себя watcom'ом, все ок.
Т.е., получается рекомендация инициализировать рандом конструкцией srand(time(NULL)) устарела?
Я выкрутился использовав srand(GetTickCount())
Ну или oxy предложил хороший вариант.


 

Member
Статус: Не в сети
Регистрация: 15.02.2009
Откуда: Лангепас
hub писал(а):
Я выкрутился использовав srand(GetTickCount()).


Это уже "непортабельно" :beer:


 

Member
Статус: Не в сети
Регистрация: 10.12.2003
hub
По-моему, ты так ничего и не понял.
Цитата:
Т.е., получается рекомендация инициализировать рандом конструкцией srand(time(NULL)) устарела?

Почему устарела? Все работает нормально. Кроме первого значения, которое ты, фактически, сам задаешь из времени.
Цитата:
Я выкрутился использовав srand(GetTickCount())
Ну или oxy предложил хороший вариант.

Если тебя устраивает time(NULL)*17, то тогда не морочь другим голову, а напиши свой собственный генератор, который будет считать каждое следующее "случайное" число по формуле x[n+1] = (x[n]*17)%RAND_MAX. И назови его MySuperRandom.


 

Member
Статус: Не в сети
Регистрация: 15.02.2009
Откуда: Лангепас
theone писал(а):
...Все работает нормально. Кроме первого значения, которое ты, фактически, сам задаешь из времени...


+1. Я тоже устал показывать разницу между случайным и псевдослучайным числом.

А, кто нибудь, знает способ получения истинно случайного числа? Без использования спецаппаратуры (хоть она и мало стоит). Может что-то появилось в PC-AT архитектуре-случайное ;)


 

Advanced member
Статус: Не в сети
Регистрация: 30.08.2003
Откуда: Санкт-Петербург
oxy
Цитата:
А, кто нибудь, знает способ получения истинно случайного числа? Без использования спецаппаратуры (хоть она и мало стоит). Может что-то появилось в PC-AT архитектуре-случайное ;)

а) TPM
б) аппаратный генератор случайных чисел, встроенный в чипсет. Была такая фишка, но вот юзает ли кто ее реально - вопрос. Документацию можно найти на сайте Intel'а.

_________________
{:€ дед в законе :-) нородный окодемег
почетный пользователь OpenSuSE 11.3
Ремонт и модернизация ноутбуков IBM (Lenovo) ThinkPad


 

Member
Статус: Не в сети
Регистрация: 15.02.2009
Откуда: Лангепас
Коль пошли выяснения особенностей функции rand(); в различных компиляторах, то предлагаю проверочку на "вшивость" "первого значения" (параметры цикла меняем как хотим). Не во всех компилерах (а точнее rtm-lib`ах) всё красиво, как выяснил hub
Код:
#include <stdio.h>
#include <stdlib.h>
int main(int,shar**)
{
   int i;
   puts("time(t)\t\trand()\n\r ");
   for(i=23;i<230;i++)
   {
      srand(i);
      printf("%i\t%i\n\r",i,rand());
   }
   return (0);
}


 

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


 

Member
Статус: Не в сети
Регистрация: 15.02.2009
Откуда: Лангепас
Хм... Извини... Сам в своё время в униивере по 10-12 часов сидел за ЕС-1840/41. И тебе советую. Лабу за тебя написать - это только за бабло, а тут оказывается помощь ищущим, но попавшим в тупик...


 

Member
Статус: Не в сети
Регистрация: 11.01.2009
Пытаюсь написать функцию для открытия файлов, но при этом чтобы выдавалось сообщение, что найденный файл не найден. Получилось вот такое:


Код:
void openfiler(char *fname,FILE *fstream)
{
 if ((fstream=fopen(fname,"r"))==NULL)
   {
     printf("Can't open \"%s\" file ===> exit...",fname);
     getch();
     exit(1);
   }
}


Но проблема в том, что потом в main функции со fstream выдают ошибку. Подозреваю, что это из-за того, что когда эта функция openfiler заканчивается, то она разрушает созданный в ней поток fstream (возможно это и не так). Каким образом сделать, чтобы поток не разрушался?


 

Member
Статус: Не в сети
Регистрация: 15.02.2009
Откуда: Тула/Москва
Доброго всем времени суток!
Вот задача:
есть текст в .txt файле (вес файла примерно на 500 kb), текст на Финском языке. Естесно используется Юникод. Так как язык основан на латинице + есть символы из дополнительной латиницы, то возникла проблема в том как корректно считать его из файла.

помогите кто чем может пожалуйста! по возможности наиболее простые варианты :-)


 

Member
Статус: Не в сети
Регистрация: 02.02.2008
Откуда: Ростов-на-Дону
Фото: 3
tolikrog, указатель неправильно передаёшь. Нужно так (указатель на указатель):
Код:
void openfiler(char *fname, FILE** fstream)


 

Member
Статус: Не в сети
Регистрация: 15.08.2007
Jonny_B_112
юникоды разные бывают, UCS-2 / UCS-4 (два байта или четыре на символ) считываются _wfopen и работается с wchar_t вместо char, при этом под windows используется UCS-2 (и sizeof(wchar_t) == 2), а под *nix обычно UCS-4 (и sizeof(wchar_t) == 4).
Если это UTF-8, то работается обычными функциями fopen и символы в char, при этом для финского они один символ будет от 1 до 2 байт, 1 байт для латинских символов входяхих в ASCII, и 2 байта для символов с умляутами.


 

Member
Статус: Не в сети
Регистрация: 15.02.2009
Откуда: Тула/Москва
progn
спасибо за ответ. у меня тогда еще один вопрос: допустим если утф-8 использую, как тогда производить выбор 1 или 2 байта отводить на символ? даже точнее, как определить 1 или 2 байта считывать из файла? =) не понимаю этого. мы же сначала считываем, а только потом скажем можем проверить если в аски есть то значит это латиница по 1б, а если нет то по 2б
и тогда может для простоты лучше UCS-2 использовать? не парясь по 2 байта читать какбэ?


 

Member
Статус: Не в сети
Регистрация: 15.08.2007
Jonny_B_112
отличить можно по старшему биту http://ru.wikipedia.org/wiki/UTF-8, т.е. первый байт многобайтовых символов будет отрицательный.

но обычно так низкоуровнего работать совершенно не к чему, есть библиотеки и API ОС.

для windows можно читать файл utf-8 по строкам, потом преобразовывать в более удобный для работы UCS-2 с помощью WinAPI функции MultiByteToWideChar, или изначально держать файл в UCS-2.

из сторонних библотек есть кроссплатформенная ICU (http://icu-project.org)


 

Member
Статус: Не в сети
Регистрация: 15.02.2009
Откуда: Тула/Москва
ага, спасибо =) буду пробовать


 

Member
Статус: Не в сети
Регистрация: 11.01.2009
Есть обычный текстовый файл, и в этом файле в конце стоит пустая строчка, без всяких символов, надо эту строчку пустую убрать.
Я как понял, там пустая строчка из-за того, что в конце файла стоит символ \n, я написал следующий код, этот код начинает работать, когда указатель стоит в самом конце файла:

Код:
  }
  fpos_t pos;
  char chh='\0';
  fgetpos(instream, &pos);
  pos--;
  fsetpos(instream,&pos);
  fwrite(&chh,sizeof(char),1,instream);
  fclose(instream);
 }


Тут по моей идеи, последний символ файла \n должен заменяться на \0, да, пустая строчка исчезает, но при этом на последней строчке появляется пробел... а если chh='a', вместо пробела будет a. А нужно, чтобы пробела не было... Объясните, от куда берется пробел, если вставляется лишь только нулевой символ, которой должен обозначать конец строки.


Показать сообщения за:  Поле сортировки  
Начать новую тему Новая тема / Ответить на тему Ответить  Сообщений: 1730 • Страница 61 из 87<  1 ... 58  59  60  61  62  63  64 ... 87  >
-

Часовой пояс: UTC + 3 часа


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 1


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Перейти:  
Создано на основе phpBB® Forum Software © phpBB Group
Русская поддержка phpBB | Kolobok smiles © Aiwan