Чому цей код дає дивний результат? Так випадково?

У мене є шматок коду, який генерує деяке випадкове число і друкує на консолі. Однак мені цікаво, як він малює, наприклад, наприклад

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
додано

Я думаю, це випадково ... Ви використовуєте певне насіння для функції random . Ви просто знайшли насіння, яке дасть вам цифри від 0 до 9, в порядку.

EDIT: Мабуть, це алгоритм:

Клавіатура java.util.Random реалізує те, що зазвичай називається лінійним конгруентним генератором (LCG). LCG по суті є формулою такої форми:   номер i + 1 = (a * номер i + c) mod m

Source: here

7
додано
JavaMex знає все. Він також є учасником StackExchange; o) umm @Neil Coffee, я думаю, його ім'я. Він дуже добре знає свою Java і Random. До голосування, щоб ви поділилися своїм джерелом так добре.
додано Автор Ellie Kesselman, джерело

Клас Random є генератором псевдослучайних чисел . Таким чином, він не є істинно випадковим, але спирається на математичні операції, виконуються за початковим значенням. Таким чином, певне насіння дасть певні (потенційно цікаві/веселі) послідовності

3
додано
Так, особливо з огляду на те, що певне насіння дасть певні веселі, але не обов'язково "значні" послідовності. Або, скоріше, не "істотно", якщо немає мотива, з криптографічної точки зору, і я думаю, що це за межі нашої сфери. Я отримав насолоду від вашої відповіді, це змусило мене посміхнутися. Дякую тобі за це.
додано Автор Ellie Kesselman, джерело

Створення випадкового з насінням забезпечує певну поведінку. Тим більше, що створення двох випадків випадкового з одним і тим же насінням завжди буде поводитися однаково. Хтось дізнався (за допомогою грубої сили, я думаю), що використання цього конкретного насіння разом з першим 10 наступним іменем (10) створює таку, здавалося б, упорядковану послідовність. Ця послідовність є псевдовипадковим першим творінням updon, але його можна відтворити. Змінюючи що-небудь найменше, видається інший результат.

2
додано

Причиною для послідовності є те, що можна протестувати програмне забезпечення, роблячи випадковий прогноз передбачуваними і повторюваними послідовностями, використовуючи його наступні методи. Кожного разу, коли певний довгий параметр насіння є параметром конструктора випадкових, об'єкт instanced 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
додано
ІТ КПІ - Java
ІТ КПІ - Java
436 учасників