Аппаратный RNG - Как использовать?

Хорошо, я только что взял аппаратные средства 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).
1
задан LiamB 20 July 2010 в 18:00
поделиться

3 ответа

Чтобы получить случайное int в заданном диапазоне, вы можете использовать GetRandomDouble , которая предоставляется аппаратным обеспечением, и масштабирует это значение в соответствии с желаемым диапазоном. Максимальное значение является исключающим, поскольку нижележащий двойной диапазон [0,1) является полуоткрытым.

int GetRandomInt(int min, int max) {
   double d = randHardware.GetRandomDouble();
   return ((max-min)*d)+min;
}
2
ответ дан 2 September 2019 в 22:54
поделиться

Если бы у меня были эти функции без какой-либо другой помощи или указаний, первая попытка, которую я сделал бы, это (просто глядя на подпись):

uint length = 20;
object array;
GetRandomBytes(length, out array);

Затем я попытаюсь отладить это и посмотреть, какой на самом деле тип array после вызова функции. Глядя на имя функции, я бы предположил, что byte [] , поэтому я бы написал:

byte[] result = (byte[])array;

Что касается диапазона, эти сигнатуры функций далеки от самообъяснения. Может быть, параметр length ?

Также обратите внимание, что в C # нет такой вещи, как UInt . Есть System.UInt32 и uint , которые являются ярлыками.

0
ответ дан 2 September 2019 в 22:54
поделиться

ПРИМЕЧАНИЕ: Здесь используются инклюзивные диапазоны. Вам может понадобиться эксклюзивный 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;
}
0
ответ дан 2 September 2019 в 22:54
поделиться
Другие вопросы по тегам:

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