понедельник, 21 января 2013 г.

Стандартный random C++

Что-то вдруг захотелось посмотреть, как работает функция rand() в C++. Не алгоритм генерации, а распределение результатов. Ну и забавы ради посмотрел что получилось.
Результаты получились довольной скучные - распределение примерно равномерное. Как проводились тесты - создаётся массив, зануляется, затем 10000000 прибавляется единица к случайному элементу массива, ну и затем выводится относительная частота. Объяснение немного странное, поэтому в конце поста есть код программы.
  1. Без перемешивания, 32768 элементов.
  2.  
     Под перемешиванием я имею ввиду функцию srand


     Первые 100 элементов из этой последовательности:









  3. Перемешивание в начале генерации послеовательности, 32768 элементов
  4.  
     Аналогично первые 100:








  5. Перемешивание перед генерацией каждого числа, 256 элементов
  6.  Вообще на самом деле не лучшая идея, т.к. по сути каждый раз генератор сбрасывается. Зато получается хоть какая-то оригинальная картинка.

Код программы(для последнего случая):
#include <stdio.h>
#include <stdlib.h>
#include <string>
#include <sstream>
#include <time.h>

using namespace std;

string convertInt(int number){
   stringstream ss;
   ss << number;
   return ss.str();
}

int main(){
 string f_n;
 FILE* outp;
 unsigned long int *mas = new unsigned long int [32769];
 int rand_N = 10000000;
 
 for(int n = 2; n < 32769; n *= 2){

  for(int i = 0; i < n; i++)
   mas[i] = 0;

  f_n = convertInt(n);
  f_n = f_n + "_tsr.txt";

  outp = fopen(f_n.c_str(), "w");
  for(int i = 0; i < rand_N; i++){
   mas[rand()%n]++;
   srand(time(0));
  }

  for(int i = 0; i < n; i++)
   fprintf(outp, "%d\t%f\n", i, 1.0*mas[i]/rand_N);
  fclose(outp);
 }
 return 0;
}

Для тестирования использовалась Visual Studio 2008 с её компилятором. Не думаю, что на gcc отличия будут большие(в среднем конечно) и получится примерно та же картинка.

четверг, 22 ноября 2012 г.

Немного об абстракции

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

 Разнообразие объектов в зависимости от уровня абстракции   
Сложность задачи в зависимости от уровня абстракции

При отсутствии абстракции сложность уходит в бесконечность.
Указанные графики число качественные и являются графиками довольной известных функций (плотность нормального распределения и гипербола) и приведены только для более наглядного изображения идеи. Реальные графики если и есть, то могут быть значительно сложней.

воскресенье, 14 октября 2012 г.

Чем можно открыть большие текстовые файлы

Последнее время пришлось повозится с большими текстовыми файлами (размером более половины гигабайта) и, как оказывается, далеко не все редакторы их легко открывают. И так небольшая статистика, для файла размером в 2.4 ГБ:
1. Notepad (Блокнот) - выдал ошибку, что файл слишком большой и попросил открыть его другим редактором.
2. MS Word, Notepad++ - тоже самое.
3. Wordpad - сожрал 1.3 ГБ оперативной памяти и завис. Пытался сожрать ещё больше, но открывали на нетбуке у которого всего 2 ГБ. Когда открывал на компе файл размерном в 643 МБ он сожрал столько же, файл всё-таки открыл, но любое действие вызывало 2-х минутное зависание.

Стандартные (и не очень) редакторы от Microsoft (ну за исключением Notepad++ - он не от них) не справились с большими файлами. А что же нам приготовил Линукс:
1. Nano - с файлом в 2.4 ГБ он не справился, а файл размерном 643 Мб открыл за две минуты, причём не глючит и не виснет.
2. Vim - файл в 2.4 ГБ открыл за 2 минуты, отлично работал и даже не намекал на зависание. С меньшим фалом справился ещё лучше.

После этого небольшого экспериментика сделал вывод, что большие файлы лучше открывать консольными редакторами, а для обычных файлов любые сойдут.

вторник, 10 июля 2012 г.

Аппаратная мощность - не всё для скорости работы программы

Люди, далёкие от программирования и вычислительной техники, часто считают, что скорость работы программы полностью определяется аппаратной мощностью вычислительной системы. Не так давно я пытался доказывать, что некоторые задачи нельзя быстро решить просто по тому, что не придумали хорошего алгоритма решения этих задач (я сейчас про класс NP). Однако мне кажется, что я не был убедителен. В искупление этого записал видео, где сравниваются две разных структуры и соответствующие им алгоритмы разработки. Так что если кому-то придётся объяснять нечто подобное можете сослаться на это видео.
Исходный код используемой в видео программы.
Само видео:

Начинайте с простого

Прежде, чем лесть в интернет, искать, почему же не работает микрофон на Ubuntu и в отчаянии думать что всё, все планы сломались, проверьте - включен ли микрофон ;)

воскресенье, 8 июля 2012 г.

Где используются многомерные пространства

Почему-то в середине лета решал дать ответ на этот вопрос.
На самом деле пространства размерности выше 3 используется очень часто и очень много где, просто понятие пространства в математики не сводятся только к бытовому понятию пространства (извиняюсь за тавтологию, но надеюсь понятно). Обычно пытаются по аналогии продолжить: двухмерное это длина и ширина,  трёхмерное - длина, ширина, высота, значит и дальше сохраняется эта схема. Собственно эти рассуждения и приводят в тупик.
Теперь примеры, где используются пространства размерности выше 3:
  • Теория относительности и М-теория
 В специальной теории относительности пространство-время представляется в виде 4-х мерного пространства Минковского, в котором три компоненты пространственные и одна временная. Это пространство можно назвать "плоским" - оно однородно и изотропно (временная компонента только изотропна). В общей теории относительности используется более сложное пространство - пространство Римана. Так же 4-х мерное.Оно уже не является плоским и искривлено как только можно, физически искривление в пространство вносит масса.
В M-теории используют 11 или 12-ти мерные пространства, точно не помню. Собственно это всё, что я знаю об этом.
  • Обобщенные координаты
Это уже более привычная вещь, которую можно представить. Для примера рассмотрим человека. У человека есть лицо, спина, право, лево, верх и низ. И так же пусть он находится в помещении, в котором ввели некоторую декартову прямоугольную систему координат. Чтобы задать положение человека  в этом помещении не достаточно называть его координаты x, y, z, поскольку человек "ориантирован" надо задать ещё углы поворота вокруг этих осей: φ, ψ, θ (обозначения могут разнится, но смысл понятен). Вот уже получили 6-ти мерное пространство, если хоти описать его перемещение во времени, то получаем уже 7-ми мерное.
Обобщенные координаты могут представлять собой любые характеристики описываемого объекта, от цвета до квантового состояния.
  • Функциональный анализ и численные методы
Фактически функциональный анализ и занимается изучением многомерных пространств. Функция с такого представления объект многомерный: её можно раскладывать в ряд по базису (ряды Фурье, Лорана и Тейлора), можно менять базис и так далее. Это нужно для моделирования различных реальных процессов и решения прикладных задач. Однако решать задачи "на бумаге" не всегда удобно. Например систему из миллиона уравнений (а такие встречаются) просто так не решить. И поэтому пользуются численными методами: составляют программу на компьютере, который все эти вычисления проводит. Однако вот беда - память компьютера конечна и он не может хранить полностью вещественные числа и ряды. Вещественные числа хранятся с определённой точностью,а с рядами поступают следующим образом: выбирают проекцию функции на некоторое конечное n-мерное подпространство и работают с ними. Проще говоря - бегут какие-то n слагаемых ряда, а про остальные забывают.

Надеюсь приведенные примеры дали ответ на вопрос, зачем такая абстракция, как n-мерное пространство и где она используется. Список далеко не полный и он составлен только для того, чтобы показать, что пространства высоких размерностей не являются ненужной вещью, как это может показаться с первого взгляда.

среда, 4 июля 2012 г.

FiguresWars - source

Нашёл последнюю версию. Мож кто захочет покопаться, правда код там в отвратительном виде. Комментариев мало, либо почти нет и так далее.
Как автор никаких ограничений на распространение, изучение и модификацию не ставлю.
Скачать можно здесь. Какое-никакое описание всё же прилагаю, но это больше описание самой игры, того что есть, а не того, как это получилось.