【问题标题】:How do you create a random 64 bit number? [closed]你如何创建一个随机的 64 位数字? [关闭]
【发布时间】:2013-07-13 10:33:19
【问题描述】:

我有一部分规范要求我创建一个随机 64 位数字,并将以下内容转换为字符串: (0 到 2^63 - 1)

我不知道括号中的意思是什么,有人可以帮忙吗?

【问题讨论】:

  • 什么编程语言、平台、环境等?
  • 好的 - 我已经在下面发布了一个 C 答案,移植到 C# 应该很简单。

标签: c# random 64-bit int


【解决方案1】:

括号是 0 到 2^63-1 之间的随机 64 位数字的集合构建符号,不包括 0 和 2^63-1。

【讨论】:

  • 我不认为它是设置符号 - 它只是表示 64 位 2 的补码带符号 int 的完整 正 范围,即 0 到 2^63 - 1 包括在内。
  • 也许吧。 OP 确实提到了括号,所以 op 的意思可能是 [0, 2^63-1]?
  • 最常见的 RNG 生成正值,因此通常 32 位 RNG 生成 0..2^31-1 的值(即不使用 32 位 int 范围的负半部分),所以它似乎如果您指定 64 位 RNG,它的输出范围可能为 0..2^63-1。但这当然只是猜测......
【解决方案2】:

由于您没有指定编程语言,我将在 C 中给出一个解决方案,然后您可以将其调整为您可能使用的任何编程语言,如果它不是 C(或近亲)。

您只需调用两次arc4random 并连接这些值:

 #include <stdint.h>
 #include <stdlib.h>

 int64_t rand64(void)
 {
     uint64_t r_lo = (uint64_t)arc4random();
     uint64_t r_hi = (uint64_t)arc4random();
     return (int64_t)((r_hi << 31) | (r_low >> 1));
 }

您可以很容易地将其转换为十六进制 ASCII 字符串:

 char s[17];

 int64_t r = rand64();
 sprintf(s, "%16llx", r);

(如果您需要十进制或其他格式,则只需相应地修改sprintf 格式字符串。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-04-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-05-20
    • 1970-01-01
    相关资源
    最近更新 更多