Границы для универсального генератора случайных массивов C#C#

Место общения программистов C#
Ответить
Anonymous
 Границы для универсального генератора случайных массивов C#

Сообщение Anonymous »

Я написал этот блок кода в попытке создать универсальный генератор случайных массивов (довольно интересный подход, если я должен так сказать)

Код: Выделить всё

public unsafe class RandomArray : DynamicArray where T : INumber {

Type _type;
Random _r;
T _min;
T _max;
int _type_size;
T _MaxValue;
T _MinValue;

private void init(int capacity) {
_MaxValue = (T)typeof(T).GetField("MaxValue").GetValue(null);
_MinValue = (T)typeof(T).GetField("MinValue").GetValue(null);
// T ratio = T
// _MaxValue & _MinValue allow us to determine the ratio
_r = new Random();
generate(capacity);
_size = capacity;
}

private void generate(int capacity) {
// take into account _min & _max
byte[] b = new byte[capacity*_type_size+1];
_r.NextBytes(b);
fixed (byte* ptr_b = b) {
T* t = (T*)ptr_b;
for (int i = 0; i < capacity; i++) {
_data[i] = *(t+i);
}
};
}

public RandomArray(int capacity, T min, T max) : base(capacity+1) {
_type_size = Marshal.SizeOf(min);
_type = min.GetType();
_min = min;
_max = max;
init(capacity);
}

}
Код представляет собой комбинацию концепций, взятых из следующих источников:
Чтобы интерпретировать байты как общий тип T:
Преобразование случайных байтов в целые числа в указанном диапазоне
Чтобы получить минимальное значение/

Код: Выделить всё

MaxValue
универсального примитивного числового типа:
Как получить максимальное и минимальное значение универсального числового типа в C#
Однако , проблема, с которой я сталкиваюсь, заключается в том, что я не могу придумать механизм для установки границ минимального и максимального элементов/ограничения диапазона генерируемых случайных чисел из-за некоторых сложностей, связанных с приведением типов.
Какую технику можно было бы имитировать проще всего:

Код: Выделить всё

_min + (*(t+i) / ratio);
где соотношение будет рассчитываться как (_MaxValue - _MinValue) / (_max - _min)
Очевидно, что _MaxValue - _MinValue будет переполнением типа, выходящим за пределы общего T, поэтому я попытался использовать BigIntegers, чтобы сделать это, но я не могу точно понять, как это должно работать .
Проблема в том, что я не могу понять, как привести результат BigInteger обратно к общему типу T, как я делал в большей части тела кода. .
Как мне поступить в случае вычисления отношения, чтобы оно было четко определено, учитывая сложности, возникающие при приведении типов?

Подробнее здесь: https://stackoverflow.com/questions/790 ... -generator
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C#»