2013-07-15 3 views
-2

У меня есть часть спецификации, которая требует от меня, чтобы создать случайное 64 битное число со следующими преобразуется в символьную строку: (от 0 до 2^63 - 1)Как создать случайное 64-битное число?

Я понятия не имею, что это значит в скобки, может ли кто-нибудь помочь?

+1

Какой язык программирования, платформа, среда и т. Д.? –

+0

oops ... C# извините – Funky

+0

OK - я уже разместил ниже ответ C, который должен быть довольно тривиальным для порта C#. –

ответ

2

В скобках обозначена установка-построитель для случайного 64-битного числа между 0 и 2^63-1, не считая 0 и 2^63-1.

+0

Я не думаю, что это установленная нотация - это просто означает полный * позитивный * диапазон дополнения 64 бит 2, подписанный int, т. Е. От 0 до 2^63 - 1 включительно. –

+0

Может быть. OP упомянул скобки, поэтому, возможно, op означает [0, 2^63-1]? – jh314

+0

Наиболее распространенные RNG генерируют положительные значения, поэтому, как правило, 32-разрядный RNG генерирует значения от 0..2^31-1 (т. Е. Отрицательная половина 32-битного интервала не используется), и поэтому представляется вероятным, что если вы указываете 64-разрядный RNG он будет иметь выходной диапазон 0..2^63-1. Но это просто догадка, конечно ... –

0

Поскольку вы не указали язык программирования, я дам решение на языке 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).

Смежные вопросы