2013-07-30 5 views
2

Я хочу создать действительно длинное целое случайное число, я хочу, чтобы это было 224 бит случайного числа. Но самый длинный тип данных, который я могу найти, беззнаковый длинный длинный, который составляет 64 бита. Сначала я сделал это:Генерировать случайное число с заданным типом данных

#include <iostream> 
#include <string> 
#include <stdint.h> 
#include <stdlib.h> 
#include <ctime> 
#include "random.h" 
int main() 
{ 
    srand(time(0)); 

    unsigned long long num1 = rand(); 
    unsigned long long num2 = rand(); 

    cout<<"1st random number = " << num1 << endl; 
    cout<<"2nd random number = " << num2 << endl; 

    return 0; 
} 

Моей идеей было бы определить новый тип данных, который является 224-битным целым числом. Так что я попытался сделать новый random.h файл:

class int224 
{ 
    unsigned int data[7]; 
} 

А затем модифицировали первый код:

#include <iostream> 
#include <string> 
#include <stdint.h> 
#include <stdlib.h> 
#include <ctime> 
#include "random.h" 
int main() 
{ 
    srand(time(0)); 

    int224 num1 = rand(); 
    int224 num2 = rand(); 

    cout<<"1st random number = " << num1 << endl; 
    cout<<"2nd random number = " << num2 << endl; 

    return 0; 
} 

Но он вернулся ошибки, может быть, я сделал ошибку, когда я определил новый тип данных , Я ценю любую помощь. Спасибо.

+0

«.. он вернулся ошибки ..» Пожалуйста, перечислите их. – usr2564301

+2

Даже 'unsigned long long num1 = rand();' на самом деле не даст вам 64-битного случайного числа. Он будет ограничен тем, что многие бит 'rand()' возвращается, в зависимости от реализации. – interjay

ответ

1

я придумал следующее, не уверен, если это будет работать для вас

#include <iostream> 
#include <chrono> 
#include <random> 

struct int224 
{ 
    unsigned int data[7]; 

    int224 operator+(int224); 
    int224 operator-(int224); 

    int224() 
    { 
    unsigned seed = 
     std::chrono::system_clock::now().time_since_epoch().count(); 

     std::minstd_rand0 mygen (seed); 

     for(auto i=0;i<7;i++) 
     data[i]=mygen();  
    } 

    friend std::ostream& operator<<(std::ostream&, const int224&); 
}; 

std::ostream& operator<<(std::ostream& os, const int224& r) 
{ 
    for(auto i=0;i<7;i++) 
     os<<r.data[i]; 
    return os; 
} 

int main() 
{ 

    int224 r; 
    std::cout<<r<<std::endl; 

    int224 j; 
    std::cout<<j; 

    return 0; 
} 
+0

@POW Я пробовал это, и ошибка: Этот файл требует поддержки компилятора и библиотеки для предстоящего стандарта ISO C++, C++ 0x. Эта поддержка в настоящее время является экспериментальной и должна быть включена с параметрами -std = C++ 0x или -std = gnu ++ 0x. – dulipat

+0

@dulipat C++ 0X - экспериментальный стандарт. Официально назван C++ 11, но реализация не завершена в GCC. Вы можете включить его, передав компилятору '-std = C++ 0x'. Просмотрите страницу состояния: http://gcc.gnu.org/projects/cxx0x.html, прежде чем жаловаться, что что-то нарушено/не работает. – P0W

1

у вас нет функции, генерирующей случайный int224, и компилятор не знает этого класса.

Вы можете создать свой собственный Rand() функцию в int224 и использовать это. функция будет помещать случайное число в каждую ячейку массива

1

Это не может работать так. Встроенная функция rand возвращает int, и вы не можете заставить ее вернуть что-то большее, просто присваивая результат большему значению. Вам придется реализовать более сложную логику и использовать несколько вызовов для rand, чтобы инициализировать различные последующие биты в результате.

1

Поскольку у вас есть массив из 7, определенный в классе, вам нужно будет вызвать функцию rand 7 раз для инициализации каждого элемента.

Также, если вы хотите, чтобы ваши номера были неподписанными, тогда это нормально, но если вы хотите, чтобы они были подписаны, позаботьтесь о том, чтобы при обращении к номерам вы отбрасывали первые 6 как unsigned, а последние - как подписанные.

+0

Извините, я не следую за вами, что вы подразумеваете под словом «вызов функции rand 7 времени для инициализации каждого элемента»? Как и где можно вызвать функцию rand? Да, я хочу, чтобы числа были неподписанными. – dulipat

+0

цикл 7 раз для назначения каждого элемента данных массива [7]. и держите в стороне второй пункт в моем ответе. поскольку это может создать проблему, если вы попытаетесь добавить числа в строке или около того. – Saksham

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