Хорошо, я только что взял аппаратные средства RNG, и он содержит некоторые простые функции как ниже,
GetRandomBytes(UInt Length,out object Array)
GetRandomDoubles(UInt Length,out object Array)
Функции, кажется, объясняются вполне прилично, как можно было бы использовать эти функции effectivly для генерации числа между определенным диапазоном?
Больше информации из некоторых документов мы нашли,
GetRandomByte
Return a single byte containing 8 random bits.
GetRandomWord
Return an unsigned integer containing 32 random bits.
GetRandomDouble
Returns a double-precision floating point value uniformly
distributed between 0 (inclusive) and 1 (exclusive).
GetRandomBytes
GetRandomWords
GetRandomDoubles
Fill in an array with random values. These methods all take
two arguments, an integer specifying the number of values
to return (as an unsigned long integer), and the array to
return the values in (as a COM Variant).
Чтобы получить случайное int
в заданном диапазоне, вы можете использовать GetRandomDouble
, которая предоставляется аппаратным обеспечением, и масштабирует это значение в соответствии с желаемым диапазоном. Максимальное значение является исключающим, поскольку нижележащий двойной диапазон [0,1) является полуоткрытым.
int GetRandomInt(int min, int max) {
double d = randHardware.GetRandomDouble();
return ((max-min)*d)+min;
}
Если бы у меня были эти функции без какой-либо другой помощи или указаний, первая попытка, которую я сделал бы, это (просто глядя на подпись):
uint length = 20;
object array;
GetRandomBytes(length, out array);
Затем я попытаюсь отладить это и посмотреть, какой на самом деле тип array
после вызова функции. Глядя на имя функции, я бы предположил, что byte []
, поэтому я бы написал:
byte[] result = (byte[])array;
Что касается диапазона, эти сигнатуры функций далеки от самообъяснения. Может быть, параметр length
?
Также обратите внимание, что в C # нет такой вещи, как UInt
. Есть System.UInt32 и uint , которые являются ярлыками.
ПРИМЕЧАНИЕ: Здесь используются инклюзивные диапазоны. Вам может понадобиться эксклюзивный max, как это обычно и бывает. Очевидно, это должно быть изменено в соответствии с вашими потребностями.
Допустим, вы получите случайную двойку
public int getIntInRangeFromDouble(int min, int max, double rand) {
int range = max-min+1;
int offset = (int)(range*rand);
return min + offset - 1;
}
Вы можете применить это, взяв случайные двойки и выполнив
int[] getIntsFromRandomDoubles(int min, int max, double[] rands) {
int[] result = new int[rands.length];
for(int i = 0; i < rands.length; i++) result[i] = getIntInRangeFromDouble(min,max,rands[i]);
return result;
}