141 / 107 / 57
Регистрация: 15.09.2017
Сообщений: 425
1

Рандомное очень большое число

19.02.2018, 12:33. Показов 1989. Ответов 17
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Здравствуйте!
Подскажите, как вывести случайное очень большое число? (от 0 до (2^64)-1)
PABCSystem.random(18446744073709551616) ругается, слишком большое целое
System.Random.Create(18446744073709551616) не работает по той же ошибке
Мне нужно целое BigInteger на выводе, подскажите пожалуйста функцию как это сделать.
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
19.02.2018, 12:33
Ответы с готовыми решениями:

Найти самое большое число в строке
Дана строка. Найти самое большое число в данной строке.

Какого числа выпало самое большое число осадков
Помогите пожалуйста решить задачу! Известны данные об осадках, выпавших за каждый день месяца....

Циклы.Найти самое большое четное число в последовательности
Найти самое большое четное число в последовательности.

Найдите самое большое число из расположенных по порядку четных, положительных элементов
Дан одномерный массив А (20). Найдите самое большое число из расположенных по порядку четных, (+)...

17
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
32830 / 21168 / 8147
Регистрация: 22.10.2011
Сообщений: 36,429
Записей в блоге: 8
19.02.2018, 12:56 2
Лучший ответ Сообщение было отмечено kotAV как решение

Решение

Pascal
1
2
3
4
5
6
7
8
9
10
11
12
uses System.Security.Cryptography;
 
function Rnd : BigInteger;
begin
  var b := new byte[8]; // 8 байт = 64 бита. Нужно будет число до 128 бит - поставишь 16
  (new System.Security.Cryptography.RNGCryptoServiceProvider).GetBytes(b);
  result := new BigInteger(b);
end;
 
begin
  Print(Rnd);
end.
, как-то так...
2
Соколиный глаз
19.02.2018, 12:59
  #3

Не по теме:

volvo, опечатка в строке 5: "=".

0
volvo
19.02.2018, 13:01
  #4

Не по теме:

Ну, я же прямо здесь набираю, IDE-то нету... Да и WDE с сайта убрали.
Исправил опечатку

0
Почетный модератор
64299 / 47594 / 32743
Регистрация: 18.05.2008
Сообщений: 115,181
19.02.2018, 13:07 5
Цитата Сообщение от kotAV Посмотреть сообщение
от 0 до (2^64)-1
Вообще-то это тип Int64.
0
141 / 107 / 57
Регистрация: 15.09.2017
Сообщений: 425
19.02.2018, 13:10  [ТС] 6
volvo, У меня ещё один вопрос.
Я вывел ключ шифрования (там двумерный массив 16 на 16), и в нём некоторые значения равны нулю, хотя стоит программа сравнивающая каждый новый ключ со всеми другими и такого быть не должно, что делать?

[[5CDDEC242BAF00F8, 0000000, 00000000000000,43C1720A0F9FC7A6,3F6CB0CCAE
48C586, , 000000000, 00000000000,708E566FAFC04FD1,
000,53F7DE6B109A56F4,3A881E9EDE7AC8A2,4ED9B55861309E02,024A4EA55F77D1DD,
4DD6EECA26C30D05,65BE7D7027AB0FD2],[0068AF1F1D837942,6CB36E3DCABF8064,632A10EEA0
7514C9,3C0EB34619AD4BF7, 0000000000,0579445B80155FE7,3B53D727ECA24E85, 0000
00000000000, 0000000000000,7422F4158833BF04,1B9A3466E5A76D1D,728ADCBE7F22AE32,
7EB5744E05294858,10F77C58C6BE8243,225CED1A53650C9F,77E6C11597DCADF3],[7763DC284C
2AC58A,158D46844217585E,4708ED7FE852E808,0CB61DC5FF5F29BB,4010620AF8441C0B,35D3C
ED671CF657C,3CFACE8CE30473E3,3D9EB751BCE2B4A9, 0000,0000000000000000,
5B9C2C27C31AB238, 00000000,3B18C8C5E9E37CFA,598DCF09CA207F0E, 00000000
0000,1AECC14B8B73DD6A],[0F1CEEF108C003F0,4BFFA52B71C80FFA,1A05EE5D0F9F79E3,17218
9BD556B3D19,67B5DDCD0FF783A7,5D988E0E96B918F4, 000000,3859D7C620A2A86A,
2C92618DA95F96C0,59C56461C620FF85,1F030C1F044EC801,77901B023D48FF2F,02CD1BE3AF95
212F,43B9081F37E08CCF,7FD3438832F10166,0D0905289D9BF942],[72A62EDA78CC2FDA,
0,654B568766756448,3FB2962098992564,56C7A63562C8EDFC,1CCB5F22A1A66648,
4D039DF690C0E6F0,7196186411C79F79,7D392057763E33FD, 00,30E8A652E575
43E6,7FE9F9B404753172,24A99C0532226D5D,158DE820244C0690,4DE9534C6866FCB2,3E438BC
00A1AC247],[14967C8F3A354C95,68DB0D62CA4F62CC,2E8DF8638440B32C,7EDCB81D3D7543AD,
06FCC0FA7AE43EC8,49E4D5123BD2A71D,00E497ADCA569C73,15D44B1095323626,4AFA58B0C555
93C1,4D321A1C5A6DA1E0,1EFBC84250E0C7CD,1F5A0AFCB4F68FB1,2A95859D3C276A0F,36F2F00
0EBECD835,3BD79A2C30306FE3, 00000],[7809CD7DFF49A980,70FC876061F384C7,
42CA7F1D81A9D36E,2FA9AAD04B999B24,7BF96CBCA55D0055,117CAE83F21D4F05,4DDD9D1CC2F7
97AA,09DFE1526470EFC7,0ABA03A11ABA9D27,4EA5674507A3BB01,0D0077A07E094E0F,34771AA
A2237A566,7FF5BB1641001B5F,1300B280A0D3EAC5,1F30A0218B1A4491,3892A31EEB2450AD],[
6257D377FE25537F,24A847B51AEC876B,7FE1F7CBDE673394,436678D5133844CD,4DCED3BA181F
1429,3FF560DFB5E5077D,10EC902F8E5D853C,5357805B9D44056C,76928688B84C2427,69180AC
5CFC2794F,2192ED2920C03FED,769EAA4C57A7AFC1,32D0C8A664E9CE5A,0FA9F8DF863D48B6,4C
73F1B6D315BD72,048FD3237753D097],[79560F80142EF527,427C07696C126EE1,0D29CED685DA
4724,0C914DF851D0FF32,3D3CE9F9954A6584,0A72C28A379C4046,263E789F132AA2EE,5DD11D3
472220713,7FCF2E4E5315CB5D,59DEAC95C455E51F,5879127C4D4722D0,47C702CF299F736E,50
B6C8CE13F8479F,3ABB0D0E0309CC10,0AADFD1CB4F56809,65EF1978D37E313D],[590D5158607C
A5A4,06BB25FBD6507C93,60BCBE803BE02CBC,0483290743B6746A,55F770C882BCC2BF,72B9D3B
5E84427EF,57CA5B8683D43216,0B7F9AD2AF28A961,130D5F3C8012562D,5178C5CDB5C780B9,20
EA9C0B9FB1DEB2,1B5CD7429D526BE4,04AD10EE76881A2A,64E7F8F20F3B5D95,7A568E011EF9BC
8E,5E5C5687A3F5A3FE],[6A57ABB08A2F103F,3146DF43825B48B7,33691511F552702F,606AB02
0B2A689ED,48CACE3724595802,2C326958FA86B25A,0EB49BD957C5D570,075F0F65F36156CA,40
CB4D972184B2CC,6AD623F497347C45,4C91474BC8EB427A,3308D3EE46540541,633B25B2C33BD3
62,03EFCC98D1C42A19,012A1ECBD925605D,161F0AB989422BF9],[456809ADCC76AF2F,1D62FEC
318EB240F,3E2BC8AE4B452D81,3C87E326ADB79B09,096920559CC6CD21,64B674BF99EE1FFA,02
47882C6AF7E29E,79261212D13D900B,3125273D12D3B508,5922CE125C3FBE62,5AC825E97DDB5F
E7,7482331FAB25A13B,0A198D2EB3C09FE8,7AC56888B5DC1DC9,3651E8F58A70526E,3848F03ED
590AD6B],[1F5AF6338486EE31,65F525583FD76544,6649B1203B035DC2,3C43E54EDF77DC17,3C
157675BC773F26,58E6F6FC7A2F54EF,04A60D1F5C1FFDFD,48E8DB2E186C7FA8,2F5694DA3B8AD9
4B,671C533609C201AC,41602206867374DB,41B4597BC17F22DD,6FC6CC52EA81028B,53C8C4C62
89949A4,6B0F6B4823990F86,782ADC8CC78C8E1B],[0FBC2A674FDD9E5A,5C907A82A07BBA59,27
6A9C1278357848,0B6768B8E5AC0FE1,147FF4233DD648D1,410CD567E866451D,11ACBFC40097B6
E0,415B86E27E6670BF,21B845E938FFAB8D,31A64B9A67F460DE,0101BCF4B5708EA4,67BA864AD
B2E8A4E,16D94688FE57F4AD,20D9EA9E3536F075,20D5065C55521961,0AA3DF8D7873C88E],[1F
A97E31E13C84C3,511B678F8A9AB176,475F83AC0F484FAB,05065DFBE043F217,029CC5C83E82A2
14,4117B15983B23473,0CA79541169F497C,5340279B242C98FE,3B6A7506D16EDD77,512E72F31
822013D,25718FE56DA7F3BE,6FD62557E9FEC27F,36C5FE21709F349F,3BA3AAF732B46C04,0D3C
FE2FD589A6AF,20F4FABAB562DB1B],[71AF20FA31124D80,0BE1060E8FC65E37,05E7C8D9071763
1E,2699030845198AF0,3EF1C035DFF152C0,138321B6D584FE88,5719E58035DA2AF8,2AFE6757B
4D16622,0E949880FDAAE273,7978FD612D3424FF,0DF3A6F6991F0604,2479F87CB5A36F64,41FE
BFD937038B9E,7B04919F061C7463,7C0C357DB6434776,7507F0C9B974D2E9]]
0
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
32830 / 21168 / 8147
Регистрация: 22.10.2011
Сообщений: 36,429
Записей в блоге: 8
19.02.2018, 13:13 7
Откуда я знаю, что делать? Кода-то не видно, который это все делает. Был бы код - возможно, было бы проще помочь.
0
141 / 107 / 57
Регистрация: 15.09.2017
Сообщений: 425
19.02.2018, 13:14  [ТС] 8
Puporev, нет, Int64 это от (-2^63) до (2^63)-1, а я написал 2^64 из которого вычесть 1.

Добавлено через 1 минуту
volvo, я уже нашёл причину, поставил проверку по значениям в BigInteger вместо проверки по значениям строк (правда теперь один ключ генерируется 2 секунды)
0
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
32830 / 21168 / 8147
Регистрация: 22.10.2011
Сообщений: 36,429
Записей в блоге: 8
19.02.2018, 13:17 9
Цитата Сообщение от kotAV Посмотреть сообщение
я написал 2^64 из которого вычесть 1
Это uint64, но от этого ничего не меняется. Параметр Seed должен быть только типа Integer в PABC.NET, так что с большими числами все равно придется обходными путями...
0
141 / 107 / 57
Регистрация: 15.09.2017
Сообщений: 425
19.02.2018, 13:22  [ТС] 10
volvo, Решил ускорить код, теперь почти каждое второе шестнадцатиричное значение это какой-нибудь 00000. Что делать? Вот код, раз уж на то пошло

Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
type
  _40key = array[1..16,1..16] of string;
 
function _40random : BigInteger;//Спасибо cyberforum
begin
  var b := new byte[8]; // 8 байт = 64 бита. Нужно будет число до 128 бит - поставишь 16
  (new System.Security.Cryptography.RNGCryptoServiceProvider).GetBytes(b);
  result := new BigInteger(b);
end;
 
function _40hextodec(c: string): biginteger;
begin
  var l: integer = c.Length;
  var k: integer;
  var a: biginteger = 0;
  if c.Length >= 1 then
  begin
    for var i:=l downto 1 do
    begin
      k:=0;
      if c[l-i+1].ToUpper='0' then k:=0;
      if c[l-i+1].ToUpper='1' then k:=1;
      if c[l-i+1].ToUpper='2' then k:=2;
      if c[l-i+1].ToUpper='3' then k:=3;
      if c[l-i+1].ToUpper='4' then k:=4;
      if c[l-i+1].ToUpper='5' then k:=5;
      if c[l-i+1].ToUpper='6' then k:=6;
      if c[l-i+1].ToUpper='7' then k:=7;
      if c[l-i+1].ToUpper='8' then k:=8;
      if c[l-i+1].ToUpper='9' then k:=9;
      if c[l-i+1].ToUpper='A' then k:=10;
      if c[l-i+1].ToUpper='B' then k:=11;
      if c[l-i+1].ToUpper='C' then k:=12;
      if c[l-i+1].ToUpper='D' then k:=13;
      if c[l-i+1].ToUpper='E' then k:=14;
      if c[l-i+1].ToUpper='F' then k:=15;
      a:=a+(biginteger.pow(16,(i-1))*k);
      end;
  end;
  Result:=a;
end;
 
function _40dectohex(n: biginteger): string;
begin
  var s: string;
  var c: char;
  for var i:=15 downto 0 do
  begin
    if n mod biginteger.Pow(16,(i+1)) div biginteger.pow(16,i) = 0 then c:='0';
    if n mod biginteger.Pow(16,(i+1)) div biginteger.pow(16,i) = 1 then c:='1';
    if n mod biginteger.Pow(16,(i+1)) div biginteger.pow(16,i) = 2 then c:='2';
    if n mod biginteger.Pow(16,(i+1)) div biginteger.pow(16,i) = 3 then c:='3';
    if n mod biginteger.Pow(16,(i+1)) div biginteger.pow(16,i) = 4 then c:='4';
    if n mod biginteger.Pow(16,(i+1)) div biginteger.pow(16,i) = 5 then c:='5';
    if n mod biginteger.Pow(16,(i+1)) div biginteger.pow(16,i) = 6 then c:='6';
    if n mod biginteger.Pow(16,(i+1)) div biginteger.pow(16,i) = 7 then c:='7';
    if n mod biginteger.Pow(16,(i+1)) div biginteger.pow(16,i) = 8 then c:='8';
    if n mod biginteger.Pow(16,(i+1)) div biginteger.pow(16,i) = 9 then c:='9';
    if n mod biginteger.Pow(16,(i+1)) div biginteger.pow(16,i) = 10 then c:='A';
    if n mod biginteger.Pow(16,(i+1)) div biginteger.pow(16,i) = 11 then c:='B';
    if n mod biginteger.Pow(16,(i+1)) div biginteger.pow(16,i) = 12 then c:='C';
    if n mod biginteger.Pow(16,(i+1)) div biginteger.pow(16,i) = 13 then c:='D';
    if n mod biginteger.Pow(16,(i+1)) div biginteger.pow(16,i) = 14 then c:='E';
    if n mod biginteger.Pow(16,(i+1)) div biginteger.pow(16,i) = 15 then c:='F';
    s:=s+c;
  end;
  Result:=s;
end;
 
function _40generatekey: _40key;
var
  gh: array[1..16,1..16] of BigInteger;
  current: biginteger;
  kk: boolean;
  t: _40key;
begin
  for var i:=1 to 16 do
  begin
    for var j:=1 to 16 do
    begin
      repeat
        current:=_40random;
        kk:=false;
        for var s:=1 to 16 do
        begin
          for var d:=1 to 16 do
          begin
            if gh[s,d]=current then kk:=true;
          end;
        end;
      until kk=false;
      gh[i,j]:=current;
    end;
  end;
  for var i:=1 to 16 do
  begin
    for var j:=1 to 16 do
    begin
      t[i,j]:=_40dectohex(gh[i,j]);
    end;
  end;
  Result:=t;
end;
0
Почетный модератор
64299 / 47594 / 32743
Регистрация: 18.05.2008
Сообщений: 115,181
19.02.2018, 13:26 11
Да, уж больно Вы любите if, даже в ущерб коду.
0
141 / 107 / 57
Регистрация: 15.09.2017
Сообщений: 425
19.02.2018, 13:27  [ТС] 12
Puporev, через case BigInteger не работают(
0
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
32830 / 21168 / 8147
Регистрация: 22.10.2011
Сообщений: 36,429
Записей в блоге: 8
19.02.2018, 13:33 13
А попробуй
Pascal
8
result := BitInteger.Abs(new BigInteger(b));
, что-то мне подсказывает, что там могли получаться отрицательные числа, что нежелательно.

Кстати, чтобы перевести в hex - достаточно:
Pascal
1
2
3
4
function _40dectohex(n: biginteger): string;
begin
  Result := n.ToString('X');
end;
0
141 / 107 / 57
Регистрация: 15.09.2017
Сообщений: 425
19.02.2018, 13:45  [ТС] 14
volvo, о да! всё заработало)

Добавлено через 5 минут
volvo, правда от этого максимум получился 2^63 (ну это понятно, раз отрицательные откуда-то брались)

Добавлено через 4 минуты
volvo,
Цитата Сообщение от volvo Посмотреть сообщение
Кстати, чтобы перевести в hex - достаточно:
мне нужно что бы они с нолями в начале были (что бы длина каждой строки была одинаковой - 16)
а так спасибо)
0
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
32830 / 21168 / 8147
Регистрация: 22.10.2011
Сообщений: 36,429
Записей в блоге: 8
19.02.2018, 13:49 15
Pascal
1
2
3
4
function _40dectohex(n: biginteger): string;
begin
  Result := n.ToString('X').PadLeft(16, '0'); // не самое сложное действие, правда?
end;
1
141 / 107 / 57
Регистрация: 15.09.2017
Сообщений: 425
19.02.2018, 14:05  [ТС] 16
Цитата Сообщение от kotAV Посмотреть сообщение
максимум получился 2^63
Исправил следующим образом:
Pascal
1
2
3
  var c: BigInteger = new BigInteger(b);
  if c>=0 then Result:=c
  else Result:=BigInteger.Abs(c)+9223372036854775806;
volvo, Правда там не 16, а 15. Спасибо)

Добавлено через 7 минут
Вернее, я так и не понял как оно работает. Некоторые по 16, некоторые по 17 вышли длиной (я так понял те, которые начинались не с числа а с буквы, тем и добавило нолик в начале)
0
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
32830 / 21168 / 8147
Регистрация: 22.10.2011
Сообщений: 36,429
Записей в блоге: 8
19.02.2018, 14:20 17
Цитата Сообщение от kotAV Посмотреть сообщение
я так понял те, которые начинались не с числа а с буквы, тем и добавило нолик в начале
Нет. Нолики добавляются всем, если длина результирующей строки меньше 16-ти. Но я больше ничего писать не буду. Ты каждый раз делаешь какие-то извращенные изменения в коде ,и только ПОТОМ говоришь, что мой код, который был вообще-то для предыдущей версии, не работает так, как тебе хочется. А он и не должен. Он работал с предыдущей версией, ДО исправлений. И он РАБОТАЛ: специально сейчас запустил VirtualBox, так у всех строк длина одинаковая: по 16 символов. И нолики есть как перед буквами, так и перед цифрами.
1
5077 / 2649 / 2349
Регистрация: 10.12.2014
Сообщений: 10,024
20.02.2018, 06:25 18
Можно же ещё проще нолики добавлять :–)
Pascal
1
n.ToString('X16')
1
20.02.2018, 06:25
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
20.02.2018, 06:25
Помогаю со студенческими работами здесь

Найдите самое большое число из расположенных по порядку четных, положительных элементов
Помогите решить Дан одномерный массив А (20). Найдите самое большое число из расположенных по...

Очень большое число
Народ, подскажите как сделать большую целочисленную переменную нестандартного размера. Например, на...

Выдает очень большое число
Не могу понять что тут не так - int a,a2,a3,a5,a10,a13; cout << "Write A here - " ; cin >> a;...

очень большое целое число
Для криптографии нужно возводить числа в большую степень, в результате чего получается очень...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
18
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru