คอมพิวเตอร์สร้างตัวเลขสุ่มอย่างไร


3

นี่อาจเป็นคำถามเดียวที่ฉันเคยถามในเว็บไซต์ stackexchange นี้ ในการเขียนโปรแกรมมีหลายวิธีในการสร้างตัวเลขสุ่มขึ้นอยู่กับภาษาที่แตกต่างกัน สิ่งที่รบกวนฉันมาระยะหนึ่งแล้วสิ่งที่คอมพิวเตอร์สร้างขึ้นจะเป็นแบบสุ่มได้อย่างไร ฉันพบ โพสต์นี้แต่ไม่ได้รับการตอบรับที่ดีนักและกล่าวกับคำตอบทั่วไปหรือคำตอบที่เป็นไปได้มากมาย อย่างไรก็ตามวิธีที่ฉันเห็นมันมีเพียงคำตอบเดียวที่เป็นไปได้มันทำงานอย่างไร! ฉันหมายความว่าคนที่มีพื้นหลังคอมพิวเตอร์ควรจะตอบคำถามนี้ได้ดังนั้นจึงไม่เหมือนกับที่ฉันขอความคิดเห็นจากคุณ ในฐานะที่เป็นบันทึกสุดท้ายฉันต้องการขออภัยหากฉันอยู่ในฟอรัมที่ไม่ถูกต้อง


คำตอบที่นี่ก็โอเค แต่ฉันพนันว่าถ้าคุณถามคำถามนี้ในเว็บไซต์ความปลอดภัยคุณจะได้รับคำตอบมากมาย การสร้างตัวเลขสุ่มอย่างปลอดภัยเป็นสิ่งสำคัญอย่างยิ่งสำหรับการเข้ารหัส มันซับซ้อนมากและมีเทคนิคมากมายที่มีความซับซ้อนและประสิทธิภาพแตกต่างกัน security.stackexchange.com/questions/tagged/prng security.stackexchange.com/questions/tagged/random
Zoredache

คำตอบ:


3

พวกเขาสามารถและไม่สามารถขึ้นอยู่กับคอมพิวเตอร์ โดยปกติแล้วมันเป็นอัลกอริธึมหลอกเทียม หนึ่งในอัลกอริทึมที่เก่าแก่ที่สุดนั้นเป็นเพียงการดำเนินการชุดของเลขคณิตพื้นฐาน (คูณหารเพิ่มบวกลบโมดูโล) ในจำนวนที่เรียกว่าเมล็ดและใช้ตัวเลขกลางหรืออะไรทำนองนั้น ตัวเลขจะปรากฏแบบสุ่ม แต่หลังจากผ่านการทดสอบไปแล้วจำนวนหนึ่งรอบเดียวกันจะทำซ้ำตัวเอง

ซึ่งหมายความว่าพวกเขาไม่สามารถใช้ PRNG เพื่อเข้ารหัสรหัสผ่านของคุณ PRNG มักใช้เวลาของระบบเป็นเมล็ดดังนั้นหากผู้โจมตีทราบเวลาโดยประมาณที่รหัสผ่านของคุณถูกเข้ารหัส (เวลาสร้างบัญชีเวลาเปลี่ยนรหัสผ่าน) พวกเขาสามารถสร้างรหัสผ่านขนาดเล็กโดยใช้ช่วงเวลานั้นและลองใช้ สร้างรหัสผ่านแทนที่จะต้องสร้างชุดค่าผสมที่เป็นไปได้ทั้งหมดที่อนุญาต

หากคุณเคยไปที่ www.random.org คุณอาจเห็นว่าพวกเขาสร้างตัวเลขสุ่มอย่างแท้จริง นั่นเป็นเพราะพวกเขาใช้อุปกรณ์เพื่อรวบรวมเสียงบรรยากาศหรือข้อมูลบรรยากาศที่มีเสียงดังและใช้สิ่งนั้น

ฉันไม่ใช่ผู้เชี่ยวชาญในเรื่องนี้ แต่ฉันคิดว่าระบบปฏิบัติการบางอย่างอาจเก็บข้อมูลจากการเคลื่อนไหวของเมาส์และแป้นพิมพ์ของผู้ใช้พร้อมกับ PRNG เพื่อสร้างตัวเลขที่ปลอดภัยพอที่จะเข้ารหัสรหัสผ่านด้วย


2
PRNG ที่ดีจะไม่ถูก seeded ในเวลานั้น แต่ยังสามารถถูก seed ได้จากข้อมูลที่ค่อนข้างน้อย (ซึ่งไม่สามารถบังคับให้ใช้กำลังได้ แต่จะเดาได้ถ้ามาจากแหล่งที่ไม่ดี)
20574

3

พวกเขาทำไม่ได้

พวกเขาใช้อัลกอริธึมที่รู้จักกันในชื่อPseudo-Random Number Generators (PRNGs) สิ่งเหล่านี้จะสร้างลำดับหมายเลขที่เหมือนกันเสมอเว้นแต่คุณจะระบุหมายเลข "เมล็ดพันธุ์" ที่ไม่ซ้ำเพื่อเริ่มต้นด้วย

หมายเลขเมล็ดสามารถสร้างขึ้นจากการรวมกันของแหล่งที่ค่อนข้างสุ่ม - ตัวอย่างเช่นตัวเลขสองสามหลักสุดท้ายของมิลลิวินาทีของเวลาปัจจุบันการเคลื่อนไหวไม่กี่ครั้งสุดท้ายของตัวชี้เมาส์

ผลที่ได้คือลำดับของตัวเลขที่สำหรับหลาย ๆ วัตถุประสงค์ก็เพียงพอแล้วเช่นเดียวกับการสุ่มลำดับที่คาดเดาไม่ได้


ว้าวฉันไม่เคยคิดว่าจะใช้อะไรบางอย่างที่มีขนาดเล็กที่สุดเป็นเวลาปัจจุบันเป็นมิลลิวินาทีฉันแค่คิดว่าวิธีการใด ๆ ที่ใช้ในการสร้างตัวเลขสุ่มนั้นไม่สามารถสุ่มได้
SemperAmbroscus

-2

นี่คือข้อมูลโค้ดจากหนึ่งในการมอบหมายของฉัน มันสร้างตัวเลขสุ่มแล้วตรวจสอบว่าหมายเลขสุ่มได้ถูกวางไว้แล้วในอาร์เรย์และถ้ามันไม่ได้ก็อนุญาตให้เข้าไปในและถ้าไม่ใช่มันไม่ได้ใช้

public static int[] RandomArray(int RandArrayNValue)
    {         
        int[] array = new int[RandArrayNValue];

        Random rand = new Random();

        for (int i = 0; i < RandArrayNValue; i++)
        {
            array[i] = i + 1;
        }

        Console.WriteLine();

        for (int i = array.Length - 1; i >= 0; i--)
        {
            int Store = rand.Next(i);

            int TempStore = array[Store]; 

            array[Store] = array[i];

            array[i] = TempStore;
            Console.WriteLine(" " + array[i]);
        }
        return array;
    }

1
OP ตระหนักถึงการทำงานของตัวเลขสุ่มในระดับนี้: "ในการเขียนโปรแกรมมีหลายวิธีในการสร้างตัวเลขสุ่มขึ้นอยู่กับภาษาต่าง ๆ " คำถามคือเกี่ยวกับว่าอะไรที่มาจากคอมพิวเตอร์สามารถสุ่มได้จริงเมื่อคอมพิวเตอร์มีการกำหนดอย่างสมบูรณ์ (เช่นอินพุต A, เราจะได้รับเอาต์พุต B เสมอ)
tsleyson

1
Random()ไม่ใช่เวทมนตร์ - คำถามนี้เกี่ยวกับการทำงาน
NReilingh
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.