【问题标题】:Hardware RNG - How to use?硬件 RNG - 如何使用?
【发布时间】:2010-07-26 16:48:12
【问题描述】:

好的,我刚刚拿起一个硬件RNG,它包含一些简单的功能,如下所示,

GetRandomBytes(UInt Length,out object Array)
GetRandomDoubles(UInt Length,out object Array)

这些函数似乎很好地解释了自己,如何有效地使用这些函数来生成某个范围内的数字?

更多信息来自我们发现的一些文档,

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).

【问题讨论】:

  • 这些函数从何而来?
  • @Darin Dimitrov,这些是捆绑在随硬件提供的 ActiveX COM 组件中的功能。哦,我还没有拿到硬件,我只是在为它到来做准备。

标签: c# random


【解决方案1】:

要获得给定范围内的随机int,您可以使用硬件提供的GetRandomDouble 函数,并缩放该值以适应所需范围。最大值是互斥的,因为底层的双精度范围 [0,1) 是半开的。

int GetRandomInt(int min, int max) {
   double d = randHardware.GetRandomDouble();
   return ((max-min)*d)+min;
}

【讨论】:

    【解决方案2】:

    如果我在没有任何其他帮助或指示的情况下拥有这些功能,我会做的第一次尝试是这样(只看签名):

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

    然后我会尝试调试一下,看看调用函数后array的实际类型是什么。查看函数的名称,我会假设 byte[],所以我会转换:

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

    就范围而言,这些函数签名远非不言自明。可能是length 参数?

    还要注意,在 C# 中没有 UInt 这样的东西。 System.UInt32uint 是一个快捷方式。

    【讨论】:

    • 更新主帖,提供更多信息
    【解决方案3】:

    注意:这使用包含范围。您可能想要独占最大值,这是典型的。显然,这应该根据您的需要进行修改。

    假设你得到一个随机的双倍

    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;
    }
    

    【讨论】:

    • 顺便说一句,我是 Java 人,而不是 C# 人。如果我弄乱了一些 C# 语法,请随时修复它或让我知道! :)
    • 更新主帖,提供更多信息
    猜你喜欢
    • 1970-01-01
    • 2013-02-27
    • 2021-09-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多