Šāds drukas paziņojums izdrukātu "hello world". Vai kāds varētu to izskaidrot?
System.out.println(randomString(-229985452) + " " + randomString(-147909649));
Un randomString()
izskatās šādi:
public static String randomString(int i)
{
Random ran = new Random(i);
StringBuilder sb = new StringBuilder();
while (true)
{
int k = ran.nextInt(27);
if (k == 0)
break;
sb.append((char)('`' + k));
}
return sb.toString();
}
Citās atbildēs ir paskaidrots, kāpēc, bet šeit ir aprakstīts, kā.
Dotais Random
gadījums:
Random r = new Random(-229985452)
Pirmie 6 skaitļi, ko r.nextInt(27)
ģenerē, ir šādi:
8
5
12
12
15
0
un pirmie 6 skaitļi, kurus r.nextInt(27)
ģenerē, ja Random r = new Random(-147909649)
ir:
23
15
18
12
4
0
Tad vienkārši saskaitiet šos skaitļus ar rakstzīmes `
(kas ir 96):
8 + 96 = 104 --> h
5 + 96 = 101 --> e
12 + 96 = 108 --> l
12 + 96 = 108 --> l
15 + 96 = 111 --> o
23 + 96 = 119 --> w
15 + 96 = 111 --> o
18 + 96 = 114 --> r
12 + 96 = 108 --> l
4 + 96 = 100 --> d
Kad java.util.Random
gadījums ir izveidots ar noteiktu sēklas parametru (šajā gadījumā -229985452
vai -147909649
), tas izmanto nejaušo skaitļu ģenerēšanas algoritmu, sākot ar šo sēklas vērtību.
Katrs Random
, kas konstruēts ar vienu un to pašu sēklu, katru reizi ģenerēs vienu un to pašu skaitļu modeli.
Random vienmēr atgriež vienu un to pašu secību. To izmanto masīvu sajaukšanai un citām operācijām, piemēram, permutācijām.
Lai iegūtu dažādas secības, ir nepieciešams inicializēt secību kādā pozīcijā, ko sauc par "seed".
Ar randomSting iegūst nejaušo skaitli i pozīcijā (seed = -229985452) no "random" sekvences. Pēc tam izmanto ASCII kodu nākamajam 27 rakstzīmju skaitlim secībā pēc sēklas pozīcijas, līdz šī vērtība ir vienāda ar 0. Tas atgriež "hello". Tāda pati darbība tiek veikta ar "world".
Es domāju, ka kods nedarbojās nevienam citam vārdam. Puisis, kurš to programmēja, ļoti labi zina nejaušo secību.
Tas ir ļoti lielisks geek kods!