Чаму гэты код дае дзіўны вынік? Так Random?

У мяне ёсць кавалак кода, які генеруе некаторы выпадковы лік і выводзіць на кансоль. Аднак мне цікава карціны, якія ён друкуе, такія як,

import java.util.*;
public class Test
{
    public static void main(String[] args)
    {
        Random random = new Random(-6732303926L);
            for(int i=0;i<10;i++)
                System.out.println(random.nextInt(10)+" ");    
    }
}

Result : 0 1 2 3 4 5 6 7 8 9 - Every number in new line.

І калі вы зменіце гэты код трохі! як,

import java.util.*;
public class Test
{
    public static void main(String[] args)
    {
        Random random = new Random(-6732303926L);
            for(int i=0;i<10;i++)
                System.out.println(random.nextInt(11)+" ");    
    }
}

Result : 8 9 2 2 10 3 8 7 0 10 - Every number in new line.

<Моцны> Што з'яўляецца прычынай 0123456789, якая не з'яўляецца выпадковым на ўсіх!

0
Оооо знайшоў яшчэ адзін - javacodegeeks.com/2011/10/weird-funny -java.html
дададзена аўтар TeaCupApp, крыніца
Было б добра, каб крэдытаваць першапачатковы крыніца
дададзена аўтар Tomasz Nurkiewicz, крыніца
Так, JCG.com з'яўляецца перепроведением артыкулы з розных блог, але яны згадваюць арыгінальны крыніца ў канцы артыкула.
дададзена аўтар Tomasz Nurkiewicz, крыніца

6 адказы

0123456789 выпадковая таксама, у дадзеным выпадку - гэта пра тое, як, верагодна, каб прыдумаць, як 14235682907, які, без сумневу, не даў вам ніякага падставы для турботы.

Вы заўважылі лапу, у асноўным. Пры друку Далей 10 чысла ў першым выпадку, яны не захоўваюць ніякага відавочнага парадку.

Гэта як манетку - узор HHHHHHHH гэтак жа верагодна, каб прыдумаць, як дакладны шаблон HHTHTTHH; ёсць 1 у 2 8 верагоднасці кожнага прыдумляе, як і на любым з 8 крокаў, ёсць 50% верагоднасць гэтага адбываецца няправільна. Але першая мадэль выглядае , як ён зламаны, а другі няма.

10
дададзена

Я думаю, што гэта выпадковае ... вы карыстаецеся пэўны насеньне для выпадковы <код /> функцыі. Вы толькі што знайшлі насеньне, якое дасць вам лік 0 - 9, у парадку.

EDIT: Мабыць, гэта алгарытм:

<Р> Клас java.util.Random рэалізуе тое, што звычайна называецца лінейным конгруэнтных генератар (LCG). LCG, па сутнасці, формула мае наступны выгляд:   нумар <суб> + 1 = (а * лік <суб> I + с) па модулю т

Source: here

7
дададзена
JavaMex ведае ўсё. Ён таксама з'яўляецца членам StackExchange; о) ммм @Neil кава Я думаю, што гэта яго імя. Ён вельмі добра ведае, што яго Java і Random. Да галасавання з вамі для абмену вашага крыніцы так добра.
дададзена аўтар Ellie Kesselman, крыніца

<Код> Выпадковае клас з'яўляецца псеўда-генератар выпадковых лікаў . Такім чынам, гэта не <ет> праўдзіва выпадковым чынам, але замест гэтага належыць на матэматычныя аперацыі, якія выконваюцца на пачатковай кошту насення. Такім чынам, некаторыя насенне будуць вырабляць пэўныя (патэнцыйна цікавы/FUN) паслядоўнасці

3
дададзена
Так, асабліва ў дачыненні да таго, што некаторыя насенне будуць вырабляць пэўны задавальненне, але не абавязкова «значную» паслядоўнасць. Ці, хутчэй, не «значны», калі адзін не мае матыў, з крыптаграфічнай пункту гледжання, і я думаю, што гэта выходзіць за рамкі нашай. Я атрымліваў асалоду ад адказ, гэта прымусіла мяне ўсміхнуцца. Дзякуй за тое, што.
дададзена аўтар Ellie Kesselman, крыніца

Стварэнне выпадковага з семем забяспечвае пэўныя паводзіны. Асабліва, ствараючы два асобніка Random з тым жа семем, заўсёды будзе паводзіць сябе аднолькава. Хтосьці пазнаў (праз грубую сілу, я думаю), што з дапамогай гэтага канкрэтнага семені разам з першым 10 nextInt (10), стварае такую, здавалася б, спарадкаваную паслядоўнасць. Гэтая паслядоўнасць з'яўляецца псеўдавыпадковых updon першага стварэння, але можа быць прайграная. Змена нічога найменшага дае іншы вынік.

2
дададзена

Прычына паслядоўнасці, так што можна праверыць праграмнае забеспячэнне, зрабіўшы Random прадказальны з прадказальнымі і паўтаранымі паслядоўнасцямі з выкарыстаннем сваіх наступнымі метадаў. Кожны раз, калі канкрэтны параметр даўно насення з'яўляецца параметрам для выпадковага канструктара инстанса Выпадковага аб'ект павінен вяртаць адны і тую ж паслядоўнасць значэнняў праз свае наступныя метады. Гэта наўмысная асаблівасць java.util.Random.

java.util.Random мае два канструктара:

Random()

і

Random(long seed)

The constructor without a long integer seed uses the system time for creating a seed value for the pseudo random number generator. No two instantiations of Random will use the same seed іyou should get a very good pseudo-random sequence. A Random instantiation using the constructor without a seed creates an instance with unpredictable sequences of values that will be pseudo-random.

The constructor with a seed value is intended only for making Random deterministic with predictable sequences using its next methods. The typical use of a seed is for software test purposes where results must be predicable іrepeatable. Every instance of Random that uses the same long seed integer will create the same sequence of results every time. The particular long you used causes the sequence to be 0 1 2 3 4 5 6 7 8 9 over іover again when getting one of 10 integer values using nextInt(10) method. This іother predictable sequences that are repeatable every time software executes are very useful for testing software іare not meant for creating unpredictable pseudo-random sequences.

2
дададзена

Выпадковы заснаваны на семені, вы даеце яму, калі вы хочаце, каб атрымаць праўдзівыя выпадковыя ліку, выкарыстоўваць функцыі часу, як насенне, і вы атрымаеце рэальную выпадковую серыю нумароў.

1
дададзена