Random Generator follows special rule - algorithm
I am creating a random number from a special rule. That rule is defined as:
The random number generator Rand[X, i, m] in range 0 to 255 that is defined as follows, where X is a non-negative integer, i is a non-negative integer, and m is a positive integer and the value produced is an integer between 0 and m-1. Let V0 and V1 be arrays of 256 entries each, where each entry is a 4-byte unsigned integer
Rand[X, i, m] = (V0[(X + i) % 256] ^ V1[(floor(X/256)+ i) % 256]) % m
With
V0={251291136, 3952231631, 3370958628, 4070167936, 123631495, 3351110283, 3218676425, 2011642291, 774603218,...}
V1={807385413, 2043073223, 3336749796, 1302105833, 2278607931, 541015020, 1684564270, 372709334, 3508252125,...}
Now given X,i,m, I want to create a matlab function to make a random number. However, my problem is that, V0[(X + i) % 256] and V1[(floor(X/256)+ i) % 256] will return a huge number, so V0[(X + i) % 256] ^ V1[(floor(X/256)+ i) % 256] is possible to implement. Note that, random number will return a value in range 0 to 255. I have no idea to implement that problem. Could you suggest to me some way to do it. This is my matlab code
function r=RD( X, i, m)
V0=[251291136, 3952231631, 3370958628, 4070167936, 123631495, 3351110283, 3218676425, 2011642291, 774603218, 2402805061, 1004366930, 1843948209, 428891132, 3746331984, 1591258008, 3067016507, 1433388735, 504005498, 2032657933, 3419319784, 2805686246, 3102436986, 3808671154, 2501582075, 3978944421, 246043949, 4016898363, 649743608, 1974987508, 2651273766, 2357956801, 689605112, 715807172, 2722736134, 191939188, 3535520147, 3277019569, 1470435941, 3763101702, 3232409631, 122701163, 3920852693, 782246947, 372121310, 2995604341, 2045698575, 2332962102, 4005368743, 218596347, 3415381967, 4207612806, 861117671, 3676575285, 2581671944, 3312220480, 681232419, 307306866, 4112503940, 1158111502, 709227802, 2724140433, 4201101115, 4215970289, 4048876515, 3031661061, 1909085522, 510985033, 1361682810, 129243379, 3142379587, 2569842483, 3033268270, 1658118006, 932109358, 1982290045, 2983082771, 3007670818, 3448104768, 683749698, 778296777, 1399125101, 1939403708, 1692176003, 3868299200, 1422476658, 593093658, 1878973865, 2526292949, 1591602827, 3986158854, 3964389521, 2695031039, 1942050155, 424618399, 1347204291, 2669179716, 2434425874, 2540801947, 1384069776, 4123580443, 1523670218, 2708475297, 1046771089, 2229796016, 1255426612, 4213663089, 1521339547, 3041843489, 420130494, 10677091, 515623176, 3457502702, 2115821274, 2720124766, 3242576090, 854310108, 425973987, 325832382, 1796851292, 2462744411, 1976681690, 1408671665, 1228817808, 3917210003, 263976645, 2593736473, 2471651269, 4291353919, 650792940, 1191583883, 3046561335, 2466530435, 2545983082, 969168436, 2019348792, 2268075521, 1169345068, 3250240009, 3963499681, 2560755113, 911182396, 760842409, 3569308693, 2687243553, 381854665, 2613828404, 2761078866, 1456668111, 883760091, 3294951678, 1604598575, 1985308198, 1014570543, 2724959607, 3062518035, 3115293053, 138853680, 4160398285, 3322241130, 2068983570, 2247491078, 3669524410, 1575146607, 828029864, 3732001371, 3422026452, 3370954177, 4006626915, 543812220, 1243116171, 3928372514, 2791443445, 4081325272, 2280435605, 885616073, 616452097, 3188863436, 2780382310, 2340014831, 1208439576, 258356309, 3837963200, 2075009450, 3214181212, 3303882142, 880813252, 1355575717, 207231484, 2420803184, 358923368, 1617557768, 3272161958, 1771154147, 2842106362, 1751209208, 1421030790, 658316681, 194065839, 3241510581, 38625260, 301875395, 4176141739, 297312930, 2137802113, 1502984205, 3669376622, 3728477036, 234652930, 2213589897, 2734638932, 1129721478, 3187422815, 2859178611, 3284308411, 3819792700, 3557526733, 451874476, 1740576081, 3592838701, 1709429513, 3702918379, 3533351328, 1641660745, 179350258, 2380520112, 3936163904, 3685256204, 3156252216, 1854258901, 2861641019, 3176611298, 834787554, 331353807, 517858103, 3010168884, 4012642001, 2217188075, 3756943137, 3077882590, 2054995199, 3081443129, 3895398812, 1141097543, 2376261053, 2626898255, 2554703076, 401233789, 1460049922, 678083952, 1064990737, 940909784, 1673396780, 528881783, 1712547446, 3629685652, 1358307511];
V1=[807385413, 2043073223, 3336749796, 1302105833, 2278607931, 541015020, 1684564270, 372709334, 3508252125, 1768346005, 1270451292, 2603029534, 2049387273, 3891424859, 2152948345, 4114760273, 915180310, 3754787998, 700503826, 2131559305, 1308908630, 224437350, 4065424007, 3638665944, 1679385496, 3431345226, 1779595665, 3068494238, 1424062773, 1033448464, 4050396853, 3302235057, 420600373, 2868446243, 311689386, 259047959, 4057180909, 1575367248, 4151214153, 110249784, 3006865921, 4293710613, 3501256572, 998007483, 499288295, 1205710710, 2997199489, 640417429, 3044194711, 486690751, 2686640734, 2394526209, 2521660077, 49993987, 3843885867, 4201106668, 415906198, 19296841, 2402488407, 2137119134, 1744097284, 579965637, 2037662632, 852173610, 2681403713, 1047144830, 2982173936, 910285038, 4187576520, 2589870048, 989448887, 3292758024, 506322719, 176010738, 1865471968, 2619324712, 564829442, 1996870325, 339697593, 4071072948, 3618966336, 2111320126, 1093955153, 957978696, 892010560, 1854601078, 1873407527, 2498544695, 2694156259, 1927339682, 1650555729, 183933047, 3061444337, 2067387204, 228962564, 3904109414, 1595995433, 1780701372, 2463145963, 307281463, 3237929991, 3852995239, 2398693510, 3754138664, 522074127, 146352474, 4104915256, 3029415884, 3545667983, 332038910, 976628269, 3123492423, 3041418372, 2258059298, 2139377204, 3243642973, 3226247917, 3674004636, 2698992189, 3453843574, 1963216666, 3509855005, 2358481858, 747331248, 1957348676, 1097574450, 2435697214, 3870972145, 1888833893, 2914085525, 4161315584, 1273113343, 3269644828, 3681293816, 412536684, 1156034077, 3823026442, 1066971017, 3598330293, 1979273937, 2079029895, 1195045909, 1071986421, 2712821515, 3377754595, 2184151095, 750918864, 2585729879, 4249895712, 1832579367, 1192240192, 946734366, 31230688, 3174399083, 3549375728, 1642430184, 1904857554, 861877404, 3277825584, 4267074718, 3122860549, 666423581, 644189126, 226475395, 307789415, 1196105631, 3191691839, 782852669, 1608507813, 1847685900, 4069766876, 3931548641, 2526471011, 766865139, 2115084288, 4259411376, 3323683436, 568512177, 3736601419, 1800276898, 4012458395, 1823982, 27980198, 2023839966, 869505096, 431161506, 1024804023, 1853869307, 3393537983, 1500703614, 3019471560, 1351086955, 3096933631, 3034634988, 2544598006, 1230942551, 3362230798, 159984793, 491590373, 3993872886, 3681855622, 903593547, 3535062472, 1799803217, 772984149, 895863112, 1899036275, 4187322100, 101856048, 234650315, 3183125617, 3190039692, 525584357, 1286834489, 455810374, 1869181575, 922673938, 3877430102, 3422391938, 1414347295, 1971054608, 3061798054, 830555096, 2822905141, 167033190, 1079139428, 4210126723, 3593797804, 429192890, 372093950, 1779187770, 3312189287, 204349348, 452421568, 2800540462, 3733109044, 1235082423, 1765319556, 3174729780, 3762994475, 3171962488, 442160826, 198349622, 45942637, 1324086311, 2901868599, 678860040, 3812229107, 19936821, 1119590141, 3640121682, 3545931032, 2102949142, 2828208598, 3603378023, 4135048896];
a=V0(mod(X+i,256));
b=V1(mod(floor(X/256)+i,256));
r=mod(a^b,m); %% Problem in here
end
Firstly, you must convert it to binary expression. And then take exponentiation
a=V0(mod(X+i,256));
b=V1(mod(floor(X/256)+i,256));
a1=zeros(1,32);
b1=zeros(1,32);
c1=zeros(1,32);
%% Convert to binary
a1=dec2bin(a);
b1=dec2bin(b);
A= sscanf(a1,'%1d');
B= sscanf(b1,'%1d');
c1=mod(A+B,2);% Bitwise
i=0;
temp=0;
for j=32:-1:1
temp= ((c1(j)* 2^ i)+temp);
i=i+1;
end
%% Random number
r= mod(temp, m);
Related
Why are my byte arrays not different even though print() says they are?
I am new to python so please forgive me if I'm asking a dumb question. In my function I generate a random byte array for a given number of bytes called "input_data", then I add bytewise some bit errors and store the result in another byte array called "output_data". The print function shows that it works exactly as expected, there are different bytes. But if I compare the byte arrays afterwards they seem to be identical! def simulate_ber(packet_length, ber, verbose=False): # generate input data input_data = bytearray(random.getrandbits(8) for _ in xrange(packet_length)) if(verbose): print(binascii.hexlify(input_data)+" <-- simulated input vector") output_data = input_data #add bit errors num_errors = 0 for byte in range(len(input_data)): error_mask = 0 for bit in range(0,7,1): if(random.uniform(0, 1)*100 < ber): error_mask |= 1 << bit num_errors += 1 output_data[byte] = input_data[byte] ^ error_mask if(verbose): print(binascii.hexlify(output_data)+" <-- output vector") print("number of simulated bit errors: " + str(num_errors)) if(input_data == output_data): print ("data identical") number of packets: 1 bytes per packet: 16 simulated bit error rate: 5 start simulation... 0d3e896d61d50645e4e3fa648346091a <-- simulated input vector 0d3e896f61d51647e4e3fe648346001a <-- output vector number of simulated bit errors: 6 data identical Where is the bug? I am sure the problem is somewhere between my ears... Thank you in advance for your help!
output_data = input_data Python is a referential language. When you do the above, both variables now refer to the same object in memory. e.g: >>> y=['Hello'] >>> x=y >>> x.append('World!') >>> x ['Hello', 'World!'] >>> y ['Hello', 'World!'] Cast output_data as a new bytearray and you should be good: output_data = bytearray(input_data)
Lua Random number generator always produces the same number
I have looked up several tutorials on how to generate random numbers with lua, each said to use math.random(), so I did. however, every time I use it I get the same number every time, I have tried rewriting the code, and I always get the lowest possible number. I even included a random seed based on the OS time. code below. require "math" math.randomseed(os.time()) num = math.random(0,10) print(num)
I'm using the random function like this: math.randomseed(os.time()) num = math.random() and math.random() and math.random() and math.random(0, 10) This is working fine. An other option would be to improve the built-in random function, described here.
This might help! I had to use these functions to write a class that generates Nano IDs. I basically used the milliseconds from the os.clock() function and used that for math.randomseed(). NanoId = { validCharacters = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789_-", generate = function (size, validChars) local response = "" local ms = string.match(tostring(os.clock()), "%d%.(%d+)") local temp = math.randomseed(ms) if (size > 0 and string.len(validChars) > 0) then for i = 1, size do local num = math.random(string.len(validChars)) response = response..string.sub(validChars, num, num) end end return response end } function NanoId:Generate() return self.generate(21, self.validCharacters) end -- Runtime Testing for i = 1, 10 do print(NanoId:Generate()) end --[[ Output: >>> p2r2-WqwvzvoIljKa6qDH >>> pMoxTET2BrIjYUVXNMDNH >>> w-nN7J0RVDdN6-R9iv4i- >>> cfRMzXB4jZmc3quWEkAxj >>> aFeYCA2kgOx-s4UN02s0s >>> xegA--_EjEmcDk3Q1zh7K >>> 6dkVRaNpW4cMwzCPDL3zt >>> R2Fct5Up5OwnHeExDnqZI >>> JwnlLZcp8kml-MHUEFAgm >>> xPr5dULuv48UMaSTzdW5J ]]
How to unpack 7-bits at a time in ruby?
I'm trying to format a UUIDv4 into a url friendly string. The typical format in base16 is pretty long and has dashes: xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx To avoid dashes and underscores I was going to use base58 (like bitcoin does) so each character fully encode sqrt(58).floor = 7 bits. I can pack the uuid into binary with: [ uuid.delete('-') ].pack('H*') To get 8-bit unsigned integers its: binary.unpack('C*') How can i unpack every 7-bits into 8-bit unsigned integers? Is there a pattern to scan 7-bits at a time and set the high bit to 0?
require 'base58' uuid ="123e4567-e89b-12d3-a456-426655440000" Base58.encode(uuid.delete('-').to_i(16)) => "3fEgj34VWmVufdDD1fE1Su" and back again Base58.decode("3fEgj34VWmVufdDD1fE1Su").to_s(16) => "123e4567e89b12d3a456426655440000" A handy pattern to reconstruct the uuid format from a template template = 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx' src = "123e4567e89b12d3a456426655440000".each_char template.each_char.reduce(''){|acc, e| acc += e=='-' ? e : src.next} => "123e4567-e89b-12d3-a456-426655440000"
John La Rooy's answer is great, but I just wanted to point out how simple the Base58 algorithm is because I think it's neat. (Loosely based on the base58 gem, plus bonus original int_to_uuid function): ALPHABET = "123456789abcdefghijkmnopqrstuvwxyzABCDEFGHJKLMNPQRSTUVWXYZ".chars BASE = ALPHABET.size def base58_to_int(base58_val) base58_val.chars .reverse_each.with_index .reduce(0) do |int_val, (char, index)| int_val + ALPHABET.index(char) * BASE ** index end end def int_to_base58(int_val) ''.tap do |base58_val| while int_val > 0 int_val, mod = int_val.divmod(BASE) base58_val.prepend ALPHABET[mod] end end end def int_to_uuid(int_val) base16_val = int_val.to_s(16) [ 8, 4, 4, 4, 12 ].map do |n| base16_val.slice!(0...n) end.join('-') end uuid = "123e4567-e89b-12d3-a456-426655440000" int_val = uuid.delete('-').to_i(16) base58_val = int_to_base58(int_val) int_val2 = base58_to_int(base58_val) uuid2 = int_to_uuid(int_val2) printf <<END, uuid, int_val, base_58_val, int_val2, uuid2 Input UUID: %s Input UUID as integer: %d Integer encoded as base 58: %s Integer decoded from base 58: %d Decoded integer as UUID: %s END Output: Input UUID: 123e4567-e89b-12d3-a456-426655440000 Input UUID as integer: 24249434048109030647017182302883282944 Integer encoded as base 58: 3fEgj34VWmVufdDD1fE1Su Integer decoded from base 58: 24249434048109030647017182302883282944 Decoded integer as UUID: 123e4567-e89b-12d3-a456-426655440000
Fit many pieces of data in Gnuplot's for loop
Data Model Decreasing-err Constant-err Increasing-err 2025 73-78 80-85 87-92 2035 63-68 80-85 97-107 2050 42-57 75-90 104.5-119.5 which data-structure (use of -err) described here. To plot the points, I run set terminal qt size 560,270; set grid; set offset 1,1,0,0; set datafile separator " -"; set key autotitle columnhead; plot for [i=2:6:2] "data.dat" using 1:(0.5*(column(i)+column(i+1))):(0.5*(column(i+1)-column(i))) with yerror; and get However, I would like to add a line fits to these points which you cannot do just with with yerrorlines because of kinks. My pseudocode for fitting the increasing and decreasing lines inc(x) = k1*x + k2; con(x) = n1*x + n2; dec(x) = m1*x + m2; fit inc(x), con(x) dec(x) for [i=2:6:2] "data.dat" using 1:(0.5*(column(i)+column(i+1))):(0.5*(column(i+1)-column(i))) via k1,k2,n1,n2,m1,m2; where the problem is in using the function fit with for loop. How can you use Gnuplot's fit in a for loop? I would like to fit many lines at the same time to the data.
I would use do in conjunction with eval to do this: # Define your functions (you can also use do + eval to do this) f1(x) = a1*x+b1 f2(x) = a2*x+b2 f3(x) = a3*x+b3 # Loop do for [i=1:3] { eval sprintf("fit f%g(x) 'data.dat' u 0:%g via a%g, b%g", i, i, i, i) } You can adapt the above to your own purposes.
Determining All Possibilities for a Random String?
I was hoping someone with better math capabilities would assist me in figuring out the total possibilities for a string given it's length and character set. i.e. [a-f0-9]{6} What are the possibilities for this pattern of random characters?
It is equal to the number of characters in the set raised to 6th power. In Python (3.x) interpreter: >>> len("0123456789abcdef") 16 >>> 16**6 16777216 >>> EDIT 1: Why 16.7 million? Well, 000000 ... 999999 = 10^6 = 1M, 16/10 = 1.6 and >>> 1.6**6 16.77721600000000 * EDIT 2:* To create a list in Python, do: print(['{0:06x}'.format(i) for i in range(16**6)]) However, this is too huge. Here is a simpler, shorter example: >>> ['{0:06x}'.format(i) for i in range(100)] ['000000', '000001', '000002', '000003', '000004', '000005', '000006', '000007', '000008', '000009', '00000a', '00000b', '00000c', '00000d', '00000e', '00000f', '000010', '000011', '000012', '000013', '000014', '000015', '000016', '000017', '000018', '000019', '00001a', '00001b', '00001c', '00001d', '00001e', '00001f', '000020', '000021', '000022', '000023', '000024', '000025', '000026', '000027', '000028', '000029', '00002a', '00002b', '00002c', '00002d', '00002e', '00002f', '000030', '000031', '000032', '000033', '000034', '000035', '000036', '000037', '000038', '000039', '00003a', '00003b', '00003c', '00003d', '00003e', '00003f', '000040', '000041', '000042', '000043', '000044', '000045', '000046', '000047', '000048', '000049', '00004a', '00004b', '00004c', '00004d', '00004e', '00004f', '000050', '000051', '000052', '000053', '000054', '000055', '000056', '000057', '000058', '000059', '00005a', '00005b', '00005c', '00005d', '00005e', '00005f', '000060', '000061', '000062', '000063'] >>> EDIT 3: As a function: def generateAllHex(numDigits): assert(numDigits > 0) ceiling = 16**numDigits for i in range(ceiling): formatStr = '{0:0' + str(numDigits) + 'x}' print(formatStr.format(i)) This will take a while to print at numDigits = 6. I recommend dumping this to file instead like so: def generateAllHex(numDigits, fileName): assert(numDigits > 0) ceiling = 16**numDigits with open(fileName, 'w') as fout: for i in range(ceiling): formatStr = '{0:0' + str(numDigits) + 'x}' fout.write(formatStr.format(i))
If you are just looking for the number of possibilities, the answer is (charset.length)^(length). If you need to actually generate a list of the possibilities, just loop through each character, recursively generating the remainder of the string. e.g. void generate(char[] charset, int length) { generate("",charset,length); } void generate(String prefix, char[] charset, int length) { for(int i=0;i<charset.length;i++) { if(length==1) System.out.println(prefix + charset[i]); else generate(prefix+i,charset,length-1); } }
The number of possibilities is the size of your alphabet, to the power of the size of your string (in the general case, of course) assuming your string size is 4: _ _ _ _ and your alphabet = { 0 , 1 }: there are 2 possibilities to put 0 or 1 in the first place, second place and so on. so it all sums up to: alphabet_size^String_size
first: 000000 last: ffffff This matches hexadecimal numbers.
For any given set of possible values, the number of permutations is the number of possibilities raised to the power of the number of items. In this case, that would be 16 to the 6th power, or 16777216 possibilities.