Код: Выделить всё
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 будет переполнением типа, выходящим за пределы общего T, поэтому я попытался использовать BigIntegers, чтобы сделать это, но я не могу точно понять, как это должно работать .
Проблема в том, что я не могу понять, как привести результат BigInteger обратно к общему типу T, как я делал в большей части тела кода. .
Как мне поступить в случае вычисления отношения, чтобы оно было четко определено, учитывая сложности, возникающие при приведении типов?
Подробнее здесь: https://stackoverflow.com/questions/790 ... -generator
Мобильная версия