Я ищу алгоритм, который позволяет мне генерировать псевдослучайные числа, но .. Как я могу интервал чисел из n-бит? если у вас есть пример для с ++ будет здорово
например:
BigNumber random (биты 256)
Как я могу получить наименьшее и наибольшее количество 256 бит
Спасибо всем, ребята, я нашел решение
если у меня есть n-бит, числа между (2 ^ n) / 2 и (2 ^ n) -1
Если тип случайных чисел int
Вы могли бы использовать &
оператор для маскировки ненужных битов с использованием подходящей битовой маски, например, двоичный 00001111
за первые четыре бита.
rand()
функция возвращает число от 0 до RAND_MAX
, Если n меньше количества бит в RAND_MAX
, вы можете использовать это:
rand() % (1<<n)
Однако, если n больше, чем число битов в RAND_MAX, вам нужно сгенерировать несколько случайных чисел и объединить их.
Например, если RAND_MAX равен 32767 (15 бит), и вы хотите 32 случайных бита, вам потребуется следующее:
rand() ^ (rand() << 15) ^ ((rand() & 3)<<30)
Первый rand () возвращает младшие 15 битов, второй биты 15-29 и последние биты 30 и 31.
#include <stdlib.h>
int getNBitRandom( unsigned int n ) {
return rand() % ( 1 << n );
}
В общем, вы должны добавить проверку, если n
тогда меньше 31
,
Для случайного числа до размера int
, вы можете использовать функцию ниже:
unsigned int GetRandVal(int numOfBits)
{
static int numOfBitsInRandMax = 0;
if (numOfBitsInRandMax == 0)
{
srand((unsigned int)time(NULL));
for (int randMax = RAND_MAX; randMax > 0; randMax >>= 1)
numOfBitsInRandMax++;
}
int quotient = numOfBits / numOfBitsInRandMax;
int remainder = numOfBits % numOfBitsInRandMax;
unsigned int randVal = 0;
for (int i=0; i<quotient; i++)
randVal = (randVal<<numOfBitsInRandMax)|rand();
return (randVal<<remainder)|(rand()&((1<<remainder)-1));
}
Для большего случайного числа вы можете вызвать эту функцию несколько раз и сохранить каждое из возвращаемых значений в массиве, который будет представлять число. Например, если вы хотите получить 256-битное случайное число:
#define BITS_PER_INT (sizeof(int)*CHAR_BIT)
unsigned int array[256/BITS_PER_INT];
for (int i=0; i<256/BITS_PER_INT; i++)
array[i] = GetRandVal(BITS_PER_INT);
Вы можете установить диапазон следующим образом:
int rangeMin = 1,
rangeMax = 100,
generatedNumber;
generatedNumber = rangeMin + rand() % rangeMax;