181783497276652981 এবং 8682522807148012 এলোমেলো (জাভা 7) এ কী আছে?


112

কেন 181783497276652981এবং 8682522807148012নির্বাচিত হয়েছিল Random.java?

জাভা SE JDK 1.7 থেকে সম্পর্কিত উত্স কোডটি এখানে রয়েছে:

/**
 * Creates a new random number generator. This constructor sets
 * the seed of the random number generator to a value very likely
 * to be distinct from any other invocation of this constructor.
 */
public Random() {
    this(seedUniquifier() ^ System.nanoTime());
}

private static long seedUniquifier() {
    // L'Ecuyer, "Tables of Linear Congruential Generators of
    // Different Sizes and Good Lattice Structure", 1999
    for (;;) {
        long current = seedUniquifier.get();
        long next = current * 181783497276652981L;
        if (seedUniquifier.compareAndSet(current, next))
            return next;
    }
}

private static final AtomicLong seedUniquifier
    = new AtomicLong(8682522807148012L);

সুতরাং, new Random()কোনও বীজ প্যারামিটার ব্যতীত প্রার্থনা করা বর্তমান "বীজ বিশোধক" গ্রহণ করে এবং এটির সাথে এক্সওআরওস লাগবে System.nanoTime()। তারপরে এটি 181783497276652981পরের বারের জন্য সংরক্ষণ করার জন্য আরেকটি বীজ অদ্বৈতকরণ তৈরি করতে ব্যবহার করে new Random()

আক্ষরিক 181783497276652981Lএবং 8682522807148012Lধ্রুবকগুলিতে স্থাপন করা হয় না তবে এগুলি অন্য কোথাও উপস্থিত হয় না।

প্রথমে মন্তব্যটি আমাকে একটি সহজ নেতৃত্ব দেয়। নিবন্ধটির জন্য অনলাইনে অনুসন্ধান করা প্রকৃত নিবন্ধটি দেয়8682522807148012কাগজে উপস্থিত হয় না, তবে 181783497276652981উপস্থিত হয় - অন্য সংখ্যার একটি স্ট্রিং হিসাবে 1181783497276652981, যা 181783497276652981একটি 1প্রেন্টেন্ট সহ।

কাগজটি দাবি করেছে যে 1181783497276652981এমন একটি সংখ্যা যা লিনিয়ার কংগ্রেসিভ জেনারেটরের জন্য ভাল "যোগ্যতা" দেয়। এই নম্বরটি কি জাভাতে সহজেই অনুলিপি করা হয়েছিল? না 181783497276652981একটি গ্রহণযোগ্য মেধার আছে?

এবং কেন 8682522807148012বেছে নেওয়া হয়েছিল?

উভয় সংখ্যার জন্য অনলাইনে অনুসন্ধান করলে কোনও ব্যাখ্যা পাওয়া যায় না, কেবলমাত্র এই পৃষ্ঠাগুলির 1সামনেও বাদ পড়ার বিষয়টি লক্ষ্য করা যায় 181783497276652981

এই দুটি সংখ্যা হিসাবে কাজ করতে পারে যে অন্যান্য সংখ্যা চয়ন করা যেতে পারে? কেন অথবা কেন নয়?


আমি কেবল এটিই উল্লেখ করতে চাই যে উল্লিখিত ধ্রুবকের কোনওটিই নয় (এমনকি শুরুতে এটির সাথে আরও বড়গুলিও) ফিট করার পক্ষে খুব বেশি নয় যদিও গুণটি অবশ্যই একটি ওভারফ্লোতে পরিণত হবে।
ন্যানোফারাড

6
8682522807148012ক্লাসের পূর্ববর্তী সংস্করণটির একটি উত্তরাধিকার, যা 2010 সালে করা সংশোধনীতে দেখা যায় । 181783497276652981Lএকটি ত্রুটি লক্ষ্য প্রকৃতপক্ষে হবে বলে মনে হয় এবং আপনি একটি বাগ রিপোর্ট দায়ের করতে পারে।
Assylias

6
হয় এটি টাইপো, অর্থাত্ বাগ, বা অজানা প্রেরণার বৈশিষ্ট্য আপনাকে লেখকদের জিজ্ঞাসা করতে হবে। আপনি এখানে যা কিছু পাবেন কেবলমাত্র কম-বেশি অজ্ঞাত মতামত হবে। আপনি যদি মনে করেন এটি একটি বাগ, একটি বাগ রিপোর্ট জমা দিন।
লার্নের মারকুইস

1
বিশেষত পৃথক উত্তর দেওয়া, এটি প্রতিটি ধ্রুবকের জন্য দুটি পৃথক প্রশ্ন হতে পারে।
মার্ক হারড

1
এই জাতীয় মৌলিক শ্রেণিতে অন্তর্নিহিত একটি বিশ্বব্যাপী স্কেলাবিলিটি বাধাটি দেখে দুঃখ হয়েছে। seedUniquifierএকটি 64 কোর বাক্সে চূড়ান্তভাবে প্রার্থিত হতে পারে। একটি থ্রেড-লোকাল আরও স্কেলযোগ্য হতে পারে।
usr ডিরেক্টরির

উত্তর:


57
  1. এই নম্বরটি কি জাভাতে সহজেই অনুলিপি করা হয়েছিল?

    হ্যাঁ, একটি টাইপো বলে মনে হচ্ছে।

  2. 181783497276652981 এর কি গ্রহণযোগ্য যোগ্যতা রয়েছে?

    এটি কাগজে উপস্থাপিত মূল্যায়ন অ্যালগরিদম ব্যবহার করে নির্ধারণ করা যেতে পারে। তবে "আসল" সংখ্যার মেধা সম্ভবত বেশি।

  3. এবং কেন 8682522807148012 বেছে নেওয়া হয়েছে?

    এলোমেলো মনে হচ্ছে। কোডটি যখন লেখা হয়েছিল তখন এটি System.nanoTime () এর ফলাফল হতে পারে।

  4. এই দুটি সংখ্যা হিসাবে কাজ করতে পারে যে অন্যান্য সংখ্যা চয়ন করা যেতে পারে?

    প্রতিটি সংখ্যা সমানভাবে "ভাল" হবে না। সুতরাং, না।

বীজ কৌশল

জেআরইর বিভিন্ন সংস্করণ এবং প্রয়োগের মধ্যে ডিফল্ট-বীজ স্কিমার মধ্যে পার্থক্য রয়েছে।

public Random() { this(System.currentTimeMillis()); }
public Random() { this(++seedUniquifier + System.nanoTime()); }
public Random() { this(seedUniquifier() ^ System.nanoTime()); }

আপনি যদি পর পর একাধিক আরএনজি তৈরি করেন তবে প্রথমটি গ্রহণযোগ্য নয়। যদি তাদের সৃষ্টির সময়গুলি একই মিলি সেকেন্ড পরিসরে পড়ে তবে তারা সম্পূর্ণ অভিন্ন সিকোয়েন্স দেবে। (একই বীজ => একই ক্রম)

দ্বিতীয়টি থ্রেড নিরাপদ নয়। একই সময়ে আরম্ভ করার সময় একাধিক থ্রেড অভিন্ন আরএনজি পেতে পারে। অতিরিক্তভাবে, পরবর্তী সূচনার বীজগুলি পরস্পর সম্পর্কিত হতে থাকে। সিস্টেমের প্রকৃত টাইমার রেজোলিউশনের উপর নির্ভর করে বীজ ক্রমটি রৈখিকভাবে বৃদ্ধি পেতে পারে (n, n + 1, n + 2, ...)। হিসাবে বর্ণিত এলোমেলো বীজ কতটা আলাদা হতে হবে? এবং রেফারেন্সড পেপার সিউডোরডম সংখ্যা জেনারেটরগুলির সূচনায় সাধারণ ত্রুটি , পারস্পরিক সম্পর্কযুক্ত বীজ একাধিক আরএনজির প্রকৃত অনুক্রমের মধ্যে পারস্পরিক সম্পর্ক তৈরি করতে পারে।

তৃতীয় পদ্ধতিটি এলোমেলোভাবে বিতরণ করা হয় এবং এইভাবে অসম্পৃক্ত বীজ তৈরি করে, এমনকি থ্রেড এবং পরবর্তী সূচনাগুলিতেও। সুতরাং বর্তমান জাভা ডক্স:

এই কনস্ট্রাক্টরটি এলোমেলো সংখ্যা জেনারেটরের বীজকে এমন একটি মান হিসাবে সেট করে যা সম্ভবত এই নির্মাণকারীর অন্য যে কোনও অনুরোধ থেকে পৃথক হতে পারে।

"থ্রেড জুড়ে" এবং "অসামঞ্জস্যিত" দ্বারা প্রসারিত হতে পারে

বীজ সিকোয়েন্স গুণ

তবে বীজ ক্রমটির এলোমেলোতা অন্তর্নিহিত আরএনজির মতোই ভাল। এই জাভা প্রয়োগে বীজ ক্রমের জন্য ব্যবহৃত আরএনজি সি = 0 এবং এম = 2 ^ 64 সহ একটি গুণিত লিনিয়ার কংগ্রেসনাল জেনারেটর (এমএলসিজি) ব্যবহার করে। (মডুলাস 2 ^ 64 স্পষ্টভাবে bit৪ বিট দীর্ঘ পূর্ণসংখ্যার ওভারফ্লো দিয়ে দেওয়া হয়েছে) শূন্য গ এবং পাওয়ার-অফ-২-মডুলাসের কারণে "গুণমান" (চক্রের দৈর্ঘ্য, বিট-পারস্পরিক সম্পর্ক, ...) সীমাবদ্ধ । যেমনটি কাগজটি বলেছে, সামগ্রিক চক্রের দৈর্ঘ্যের পাশাপাশি, প্রতিটি একক বিটের নিজস্ব চক্রের দৈর্ঘ্য রয়েছে, যা কম তাৎপর্যপূর্ণ বিটের জন্য তাত্পর্যপূর্ণভাবে হ্রাস পায়। সুতরাং, নিম্ন বিট একটি ছোট পুনরাবৃত্তি প্যাটার্ন আছে। (প্রকৃত আরএনজি-তে 48-বিট কাটানোর আগে, বীজযুক্তকরণের ফলাফলটি) বিট-বিপরীত হওয়া উচিত)

তবে তা দ্রুত! এবং অপ্রয়োজনীয় তুলনা এবং সেট-লুপগুলি এড়াতে লুপের বডিটি দ্রুত হওয়া উচিত। এটি সম্ভবত এই নির্দিষ্ট এমএলসিজি-র ব্যবহার ব্যাখ্যা করে, বিনা ব্যতীত, কেবলমাত্র একটি গুণকে ছাড়াই।

এবং উল্লিখিত কাগজ 1181783497276652981 হিসাবে সি = 0 এবং মি = 2 ^ 64 এর জন্য ভাল "গুণক" এর একটি তালিকা উপস্থাপন করেছে।

সব মিলিয়ে: জেআরই-বিকাশকারীদের জন্য একটি প্রচেষ্টা;) তবে একটি টাইপও রয়েছে। (তবে কে জানে, যদি কেউ এটির মূল্যায়ন না করে তবে সম্ভাবনা রয়েছে যে অনুপস্থিত 1 জন ইতিমধ্যে বীজ আরএনজির উন্নতি করে))

তবে কিছু গুণকগুলি অবশ্যই আরও খারাপ: "1" ধ্রুব ক্রমের দিকে নিয়ে যায়। "2" একক-বিট-মুভিং সিক্যুয়েন্সের দিকে নিয়ে যায় (কোনওভাবে সম্পর্কযুক্ত) ...

আরএনজি-র জন্য আন্ত-সিকোয়েন্স-সম্পর্কটি আসলে (মন্টি কার্লো) সিমুলেশনের জন্য প্রাসঙ্গিক, যেখানে একাধিক র্যান্ডম সিকোয়েন্সগুলি তাত্ক্ষণিকভাবে এবং এমনকি সমান্তরাল হয়। সুতরাং "স্বাধীন" সিমুলেশন রান পেতে একটি ভাল বীজ কৌশল প্রয়োজন। সুতরাং সি ++ 11 স্ট্যান্ডার্ড অসামঞ্জস্য বীজ উত্পাদন করার জন্য একটি বীজ সিকোয়েন্সের ধারণাটি প্রবর্তন করে ।


3
কমপক্ষে এটি এখনও অদ্ভুত, যদি তারা সর্বাধিক উল্লেখযোগ্যটির পরিবর্তে সর্বনিম্ন উল্লেখযোগ্যটিকে বাদ দেয় তবে প্রতিটি গুণটি শেষ পর্যন্ত অবধি (steps২ পদক্ষেপের পরে) seedUniquifierশূন্যে আটকে যায় until
হ্যালোড

9

যদি আপনি বিবেচনা করেন যে এলোমেলো সংখ্যা জেনারেটরের জন্য ব্যবহৃত সমীকরণটি হ'ল:

LCGEquation

যেখানে এক্স (এন + 1) পরবর্তী সংখ্যা, একটি গুণক, এক্স (এন) বর্তমান সংখ্যা, সি বৃদ্ধি এবং এম হল মডুলাস।

আপনি যদি আরও খতিয়ে দেখেন Random, a, c এবং m শ্রেণীর শিরোনামে সংজ্ঞায়িত করা হয়

private static final long multiplier = 0x5DEECE66DL;   //= 25214903917 -- 'a'
private static final long addend = 0xBL;               //= 11          -- 'c'
private static final long mask = (1L << 48) - 1;       //= 2 ^ 48 - 1  -- 'm'

এবং protected int next(int bits)এই পদ্ধতিটি দেখে সমীকরণটি কার্যকর করা হয়েছিল

nextseed = (oldseed * multiplier + addend) & mask;
//X(n+1) =  (X(n)   *      a     +    c  ) mod m

এটি সূচিত করে যে পদ্ধতিটি seedUniquifier()আসলে এক্স (এন) পাচ্ছে বা প্রথম ক্ষেত্রে এক্স (0) যা প্রাথমিকভাবে হয় 8682522807148012 * 181783497276652981, এই মানটির পরে আরও মান পরিবর্তন করা হয় System.nanoTime()। এই অ্যালগরিদম উপরের সমীকরণের সাথে সামঞ্জস্যপূর্ণ তবে নিম্নলিখিত X (0) = 8682522807148012, a = 181783497276652981, m = 2 ^ 64 এবং c = 0. এর সাথে মিড মিটার দীর্ঘ ওভারফ্লো দ্বারা প্রবর্তিত হওয়ায় উপরের সমীকরণটি ঠিক হয়ে যায়

eq2

কাগজটির দিকে তাকালে , a = এর মান 1181783497276652981এম = 2 ^ 64, সি = 0. এর জন্য হয় তাই এটি কেবল একটি টাইপ এবং 8682522807148012এক্স (0) এর মান হিসাবে দেখা যায় যা লিগ্যাসি কোড থেকে এলোমেলোভাবে নির্বাচিত নম্বর বলে মনে হয় জন্য Randomযেমনটি এখানে দেখা যায়। তবে এই নির্বাচিত সংখ্যার যোগ্যতা এখনও বৈধ হতে পারে তবে টমাস বি দ্বারা উল্লিখিত সম্ভবত কাগজে থাকা সংখ্যার মতো "ভাল" নয়।

সম্পাদনা - নীচে মূল চিন্তাভাবনাগুলি স্পষ্ট করা হয়েছে তাই এড়ানো যায় তবে এটিকে রেফারেন্সের জন্য রেখে দেওয়া যায়

এটি আমার সিদ্ধান্তে পৌঁছে দেয়:

  1. কাগজটির উল্লেখটি মানটির জন্য নয় তবে a, c এবং m এর বিভিন্ন মানের কারণে মানগুলি অর্জন করতে ব্যবহৃত পদ্ধতির জন্য

  2. এটি কেবল কাকতালীয় যে মূল্য অন্যথায় নেতৃস্থানীয় 1 ব্যতীত একই এবং মন্তব্যটি ভুল জায়গায় স্থান দেওয়া হয়েছে (এখনও এটি বিশ্বাস করার জন্য সংগ্রাম করে)

অথবা

কাগজে টেবিলগুলির সম্পর্কে একটি গুরুতর ভুল বোঝাবুঝি হয়েছে এবং বিকাশকারীরা কেবল এলোমেলোভাবে একটি মান বেছে নিয়েছেন যতক্ষণ না এটি প্রথমবার টেবিলের মানটি ব্যবহার করার ক্ষেত্রে কী অর্থ ছিল বিশেষত যেহেতু আপনি কেবল তার সরবরাহ করতে পারেন এই বুনাগুলিকে এমনকি বিবেচনায় নেওয়া হয় না এমন কোনও উপায়ে নিজের বীজকে মূল্য দেওয়া উচিত

সুতরাং আপনার প্রশ্নের উত্তর

এই দুটি সংখ্যা হিসাবে কাজ করতে পারে যে অন্যান্য সংখ্যা চয়ন করা যেতে পারে? কেন অথবা কেন নয়?

হ্যাঁ, যে কোনও সংখ্যা ব্যবহার করা যেতে পারে, বাস্তবে আপনি যখন কোনও র্যান্ডম ইনস্ট্যান্ট করবেন তখন আপনি কোনও বীজ মান নির্দিষ্ট করে থাকেন অন্য কোনও মান ব্যবহার করছেন। এই মানটি জেনারেটরের কর্মক্ষমতাতে কোনও প্রভাব ফেলবে না, এটি ক্লাসের মধ্যে হার্ড কোডিংযুক্ত ক, সি এবং এম এর মান দ্বারা নির্ধারিত হয়।


1
সত্যই নয় - দুটি অ্যালগরিদম রয়েছে: (i) 1 প্রতিবার কনস্ট্রাক্টর ডেকে একটি নতুন এলোমেলো বীজ তৈরি করতে হবে। সেই আলগোতে একটি সাধারণ এক্স_এন + 1 = এক্স_এন * এ ব্যবহার করা হয়। দীর্ঘ ওভারফ্লোর কারণে এটি X_n + 1 = X_n * একটি মোডের সমান। একটি = 181783497276652981 এবং মি = 2 ^ 64 এর সাথে। (ii) অন্য একটি অ্যালগো, যা প্রদত্ত বীজ থেকে শুরু করে, এলোমেলো সংখ্যার সিরিজ তৈরি করে। সেই দ্বিতীয় অ্যালগোটিই আপনি উল্লেখ করেছেন এবং ডক্স ব্যাখ্যা করে যে " এটি একটি লিনিয়ার কংগ্রেসিয়াল সিউডোর্যান্ডম নম্বর জেনারেটর, যেমন নূথ দ্য আর্ট অফ কম্পিউটার প্রোগ্রামিং-এ বর্ণনা করেছেন "।
Assylias

1
@ এ্যাসিয়ালিয়াস আমি আপনার বক্তব্যটি দেখতে পেয়েছি, উত্স কোডটিতে এতটা ধরা Randomপড়েছি এবং উদ্ধৃত কাগজটিতে আমি মূল প্রশ্নটি সম্পূর্ণভাবে ছাপিয়েছি, শীঘ্রই সম্পাদনা করব, ধন্যবাদ।
জাভা ডেভিল

3

আপনার সরবরাহিত লিঙ্ক অনুসারে, তারা বেছে নিয়েছে ( নিখোঁজ 1 :) যুক্ত করার পরে ) 2 ^ 64 থেকে সেরা ফলন কারণ দীর্ঘ 2 2 128 থেকে একটি নম্বর থাকতে পারে না

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.