Вихрь Мерсенна C# случайная целочисленная реализация генератора (SFMT) моделирование Монте-Карло

Для тех, кто использует Newtonsoft Json.NET , читайте о том, как это сделать через Native JSON в IE8, Firefox 3.5 плюс Json. NET .

Также полезна документация по изменению формата дат, написанная Json.NET: Сериализация дат с помощью Json.NET

Для тех, кто слишком ленив. вот быстрые шаги. Поскольку JSON имеет свободную реализацию DateTime, вам нужно использовать IsoDateTimeConverter(). Обратите внимание, что начиная с Json.NET 4.5 формат даты по умолчанию - ISO, поэтому приведенный ниже код не требуется.

string jsonText = JsonConvert.SerializeObject(p, new IsoDateTimeConverter());

JSON будет выглядеть как

"fieldName": "2009-04-12T20:44:55"

Наконец, немного JavaScript для преобразования даты ISO в дату JavaScript:

function isoDateReviver(value) {
  if (typeof value === 'string') {
    var a = /^(\d{4})-(\d{2})-(\d{2})T(\d{2}):(\d{2}):(\d{2}(?:\.\d*)?)(?:([\+-])(\d{2})\:(\d{2}))?Z?$/.exec(value);
      if (a) {
        var utcMilliseconds = Date.UTC(+a[1], +a[2] - 1, +a[3], +a[4], +a[5], +a[6]);
        return new Date(utcMilliseconds);
      }
  }
  return value;
}

Я использовал это так

$("").text(isoDateReviver(item.fieldName).toLocaleString()).appendTo("#" + divName);

8
задан Peter Mortensen 21 February 2010 в 19:37
поделиться

4 ответа

Что вы можете сделать, так это загрузить исходный код по ссылке , которую вы обнаружили в Code Project. Разархивируйте его, загрузите решение в Visual Studio и скомпилируйте его. Это даст вам исходный код, неуправляемую dll c и файл .lib.

Вы можете P / Invoke вызывать функции в этой DLL (экспортируется только 5 простых функций, из которых вам нужны только две) или вы можете использовать эту DLL, библиотеку и файл заголовка SFMT для создания управляемой DLL-оболочки. вы можете использовать в C # без P / Invoke. Я просто попробовал этот метод, и это оказалось очень просто. Явного упорядочивания не было.

Вот как это сделать. После того, как вы загрузили и скомпилировали исходный код (вам понадобится заголовок и файл библиотеки, который создается в дополнение к dll), создайте новый проект библиотеки классов C ++ CLR. Назовите это WrapSFMT или что-то в этом роде. Зайдите в свойства проекта. В разделе C ++ / Предварительно скомпилированные заголовки измените значение на «Не использовать предварительно скомпилированные заголовки». В Linker / General / Additional Library Directories введите путь к SFMT.lib. В Linker / Input / Additional Dependencies добавьте SFMT.lib. Закройте страницы свойств. Скопируйте SFMT.h в папку вашего проекта и включите его в проект.

Отредактируйте WrapSFMT.h следующим образом:

#pragma once
#include "SFMT.H"

using namespace System;

namespace WrapSFMT {

public ref class SRandom
{
public:SRandom(UInt32);
public:UInt32 Rand32(void);
};
}

Они объявляют методы, которые будут в вашем классе. Теперь отредактируйте WrapSFMT.cpp, чтобы он читался так:

#include "WrapSFMT.h"

namespace WrapSFMT {

SRandom::SRandom(UInt32 seed)
{
    init_gen_rand(seed);
}

UInt32 SRandom::Rand32()
{
    return gen_rand32();
}
}

Они реализуют методы, которые вы объявили в файле заголовка. Все, что вы делаете, это вызываете функции из SFMT.dll, а C ++ / CLI автоматически обрабатывает преобразование из неуправляемого в управляемое. Теперь вы сможете собрать WrapSFMT.dll и ссылаться на него в своем проекте C #. Убедитесь, что SFMT.dll находится в пути, и у вас не должно возникнуть проблем.

изменить на «Не использовать предварительно скомпилированные заголовки». В Linker / General / Additional Library Directories введите путь к SFMT.lib. В Linker / Input / Additional Dependencies добавьте SFMT.lib. Закройте страницы свойств. Скопируйте SFMT.h в папку вашего проекта и включите его в проект.

Отредактируйте WrapSFMT.h следующим образом:

#pragma once
#include "SFMT.H"

using namespace System;

namespace WrapSFMT {

public ref class SRandom
{
public:SRandom(UInt32);
public:UInt32 Rand32(void);
};
}

Они объявляют методы, которые будут в вашем классе. Теперь отредактируйте WrapSFMT.cpp, чтобы он читался так:

#include "WrapSFMT.h"

namespace WrapSFMT {

SRandom::SRandom(UInt32 seed)
{
    init_gen_rand(seed);
}

UInt32 SRandom::Rand32()
{
    return gen_rand32();
}
}

Они реализуют методы, которые вы объявили в файле заголовка. Все, что вы делаете, это вызываете функции из SFMT.dll, а C ++ / CLI автоматически обрабатывает преобразование из неуправляемого в управляемое. Теперь вы сможете создать WrapSFMT.dll и ссылаться на него в своем проекте C #. Убедитесь, что SFMT.dll находится в пути, и у вас не должно возникнуть проблем.

изменить на «Не использовать предварительно скомпилированные заголовки». В Linker / General / Additional Library Directories введите путь к SFMT.lib. В Linker / Input / Additional Dependencies добавьте SFMT.lib. Закройте страницы свойств. Скопируйте SFMT.h в папку вашего проекта и включите его в проект.

Отредактируйте WrapSFMT.h следующим образом:

#pragma once
#include "SFMT.H"

using namespace System;

namespace WrapSFMT {

public ref class SRandom
{
public:SRandom(UInt32);
public:UInt32 Rand32(void);
};
}

Они объявляют методы, которые будут в вашем классе. Теперь отредактируйте WrapSFMT.cpp, чтобы он читался так:

#include "WrapSFMT.h"

namespace WrapSFMT {

SRandom::SRandom(UInt32 seed)
{
    init_gen_rand(seed);
}

UInt32 SRandom::Rand32()
{
    return gen_rand32();
}
}

Они реализуют методы, которые вы объявили в файле заголовка. Все, что вы делаете, это вызываете функции из SFMT.dll, а C ++ / CLI автоматически обрабатывает преобразование из неуправляемого в управляемое. Теперь вы сможете создать WrapSFMT.dll и ссылаться на него в своем проекте C #. Убедитесь, что SFMT.dll находится в пути, и у вас не должно возникнуть проблем.

В Linker / General / Additional Library Directories введите путь к SFMT.lib. В Linker / Input / Additional Dependencies добавьте SFMT.lib. Закройте страницы свойств. Скопируйте SFMT.h в папку вашего проекта и включите его в проект.

Отредактируйте WrapSFMT.h следующим образом:

#pragma once
#include "SFMT.H"

using namespace System;

namespace WrapSFMT {

public ref class SRandom
{
public:SRandom(UInt32);
public:UInt32 Rand32(void);
};
}

Они объявляют методы, которые будут в вашем классе. Теперь отредактируйте WrapSFMT.cpp, чтобы он читался так:

#include "WrapSFMT.h"

namespace WrapSFMT {

SRandom::SRandom(UInt32 seed)
{
    init_gen_rand(seed);
}

UInt32 SRandom::Rand32()
{
    return gen_rand32();
}
}

Они реализуют методы, которые вы объявили в файле заголовка. Все, что вы делаете, это вызываете функции из SFMT.dll, а C ++ / CLI автоматически обрабатывает преобразование из неуправляемого в управляемое. Теперь вы сможете собрать WrapSFMT.dll и ссылаться на него в своем проекте C #. Убедитесь, что SFMT.dll находится в пути, и у вас не должно возникнуть проблем.

В Linker / General / Additional Library Directories введите путь к SFMT.lib. В Linker / Input / Additional Dependencies добавьте SFMT.lib. Закройте страницы свойств. Скопируйте SFMT.h в папку вашего проекта и включите его в проект.

Отредактируйте WrapSFMT.h следующим образом:

#pragma once
#include "SFMT.H"

using namespace System;

namespace WrapSFMT {

public ref class SRandom
{
public:SRandom(UInt32);
public:UInt32 Rand32(void);
};
}

Они объявляют методы, которые будут в вашем классе. Теперь отредактируйте WrapSFMT.cpp, чтобы он читался так:

#include "WrapSFMT.h"

namespace WrapSFMT {

SRandom::SRandom(UInt32 seed)
{
    init_gen_rand(seed);
}

UInt32 SRandom::Rand32()
{
    return gen_rand32();
}
}

Они реализуют методы, которые вы объявили в файле заголовка. Все, что вы делаете, это вызываете функции из SFMT.dll, а C ++ / CLI автоматически обрабатывает преобразование из неуправляемого в управляемое. Теперь вы сможете собрать WrapSFMT.dll и ссылаться на него в своем проекте C #. Убедитесь, что SFMT.dll находится в пути, и у вас не должно возникнуть проблем.

добавить SFMT.lib. Закройте страницы свойств. Скопируйте SFMT.h в папку вашего проекта и включите его в проект.

Отредактируйте WrapSFMT.h следующим образом:

#pragma once
#include "SFMT.H"

using namespace System;

namespace WrapSFMT {

public ref class SRandom
{
public:SRandom(UInt32);
public:UInt32 Rand32(void);
};
}

Они объявляют методы, которые будут в вашем классе. Теперь отредактируйте WrapSFMT.cpp, чтобы он читался так:

#include "WrapSFMT.h"

namespace WrapSFMT {

SRandom::SRandom(UInt32 seed)
{
    init_gen_rand(seed);
}

UInt32 SRandom::Rand32()
{
    return gen_rand32();
}
}

Они реализуют методы, которые вы объявили в файле заголовка. Все, что вы делаете, это вызываете функции из SFMT.dll, а C ++ / CLI автоматически обрабатывает преобразование из неуправляемого в управляемое. Теперь вы сможете создать WrapSFMT.dll и ссылаться на него в своем проекте C #. Убедитесь, что SFMT.dll находится в пути, и у вас не должно возникнуть проблем.

добавить SFMT.lib. Закройте страницы свойств. Скопируйте SFMT.h в папку вашего проекта и включите его в проект.

Отредактируйте WrapSFMT.h следующим образом:

#pragma once
#include "SFMT.H"

using namespace System;

namespace WrapSFMT {

public ref class SRandom
{
public:SRandom(UInt32);
public:UInt32 Rand32(void);
};
}

Они объявляют методы, которые будут в вашем классе. Теперь отредактируйте WrapSFMT.cpp, чтобы он читался так:

#include "WrapSFMT.h"

namespace WrapSFMT {

SRandom::SRandom(UInt32 seed)
{
    init_gen_rand(seed);
}

UInt32 SRandom::Rand32()
{
    return gen_rand32();
}
}

Они реализуют методы, которые вы объявили в файле заголовка. Все, что вы делаете, это вызываете функции из SFMT.dll, а C ++ / CLI автоматически обрабатывает преобразование из неуправляемого в управляемое. Теперь вы сможете собрать WrapSFMT.dll и ссылаться на него в своем проекте C #. Убедитесь, что SFMT.dll находится в пути, и у вас не должно возникнуть проблем.

#include "WrapSFMT.h"

namespace WrapSFMT {

SRandom::SRandom(UInt32 seed)
{
    init_gen_rand(seed);
}

UInt32 SRandom::Rand32()
{
    return gen_rand32();
}
}

Они реализуют методы, которые вы объявили в файле заголовка. Все, что вы делаете, это вызываете функции из SFMT.dll, а C ++ / CLI автоматически обрабатывает преобразование из неуправляемого в управляемое. Теперь вы сможете собрать WrapSFMT.dll и ссылаться на него в своем проекте C #. Убедитесь, что SFMT.dll находится в пути, и у вас не должно возникнуть проблем.

#include "WrapSFMT.h"

namespace WrapSFMT {

SRandom::SRandom(UInt32 seed)
{
    init_gen_rand(seed);
}

UInt32 SRandom::Rand32()
{
    return gen_rand32();
}
}

Они реализуют методы, которые вы объявили в файле заголовка. Все, что вы делаете, это вызываете функции из SFMT.dll, а C ++ / CLI автоматически обрабатывает преобразование из неуправляемого в управляемое. Теперь вы сможете создать WrapSFMT.dll и ссылаться на него в своем проекте C #. Убедитесь, что SFMT.dll находится в пути, и у вас не должно возникнуть проблем.

5
ответ дан 5 December 2019 в 22:20
поделиться

Есть ли причина, по которой вы не можете скомпилировать реализацию C в DLL и вызвать ее из своего кода C #?

EDIT:

Извините, но у меня есть только очень ограниченное знание C (и действительно C #), но "Как создать C dll" можно ответить здесь: http://www.kapilik.com/2007/09/17/how-to- create-a-simple-win32-dll-using-visual-c-2005 / и насколько быстро можно проверить с помощью профилирования кода.

0
ответ дан 5 December 2019 в 22:20
поделиться

Я не вижу здесь вашей проблемы со скоростью. На моей машине (Core 2 Duo T7200 @ 2 ГГц) генерация случайного целого числа с помощью MT19937 или MT19937-64 занимает около 20 нс (в среднем при отрисовке 50000 чисел). Таким образом, это будет около 4,32 × 10 12 (то есть около 4 триллионов чисел) в день. И это для одного ядра. С Java. Итак, я думаю, вы можете ожидать, что производительность будет более чем адекватной для ваших нужд.

Чтобы ответить на ваш вопрос: я не знаю о реализации SFMT на C #, но преобразование кода C в C # должно быть довольно простым . Однако от этого вы ничего не добьетесь, поскольку SFMT оптимизирован для SIMD, а C # в настоящее время не поддерживает это напрямую.

0
ответ дан 5 December 2019 в 22:20
поделиться

Может быть это то, что вы ищете? Существует список из нескольких реализаций.

В частности, эта (Кори Нельсон) может быть полезна.

0
ответ дан 5 December 2019 в 22:20
поделиться
Другие вопросы по тегам:

Похожие вопросы: