สุ่มโดยไม่มีเวลา [ปิด]


9

คอมพิวเตอร์ไม่ได้ไม่มีที่ไหนเลยในการสร้างตัวเลขสุ่มโดยไม่มีพื้นฐานเนื่องจากเวลาส่วนใหญ่เป็นพื้นฐานของการสุ่ม

ฉันต้องการให้คุณสร้างรหัสที่สร้างตัวเลขสุ่มด้วยกฎเหล่านี้:

  • เวลาไม่ได้รับอนุญาตให้เป็นพื้นฐาน ณ จุดใด ๆ ของโปรแกรม
  • ไม่อนุญาตให้ใช้ฟังก์ชั่นแบบสุ่ม / แบบหลอกที่กำหนดไว้ล่วงหน้า
  • ตัวเลขที่สร้างสามารถอยู่ในช่วงใดก็ได้ อย่างน้อยสองจำนวนเต็ม: D
  • ตัวเลขจะถูกสะท้อน

2
ไม่ชัดเจนว่าคุณหมายถึงอะไรโดย "ตัวเลขที่สร้างขึ้นสามารถอยู่ในช่วงใดก็ได้" คุณหมายถึง coder มีอิสระที่จะเลือกช่วงหรือไม่? หรือว่าพวกเขาจะต้องสนับสนุนช่วงที่ผู้ใช้ร้องขอ? ทั้งสองอย่างนี้มีปัญหา หากผู้ใช้ร้องขอช่วงจะเกิดอะไรขึ้นถ้าพวกเขาร้องขอหมายเลขนอกขอบเขตของชนิดข้อมูลที่มีอยู่ภายใน และถ้า coder มีอิสระที่จะเลือกฉันเลือกจำนวนเต็มระหว่าง 1 ถึง 1: D
Jonathan Van Matre

2
น่าจะเป็นรหัสกอล์ฟ ...
Mukul Kumar

ฉันเริ่มต้นคำถามนี้เป็นคำถามยอดนิยมโค้ดโคดจะเหมาะกับเรื่องนี้หรือไม่?
Dadan

@Daniel Yeah แต่ให้คำถามนี้เป็นคำถามยอดนิยมและโพสต์คำถามใหม่ด้วยรหัสกอล์ฟพร้อมกฎใหม่ (ในรุ่นสุ่ม) ที่จะสนุก
Mukul Kumar

1
ใช้อินเทอร์เน็ตเป็นเมล็ดดูเหมือนโกงไม่ได้หรือไม่
Dean MacGregor

คำตอบ:


6

JavaScript

นั้นน่าสนุก!

arr = []
index = 0

function init(seed) {
    index = 0
    arr[0] = seed
    for (var i = 1; i < 624; i ++) {
        arr[i] = (1812433253 * (arr[i-1] ^ (arr[i-1] >>> 30)) + i) | 0
    }
 }

function getNumber() {
    if (index == 0) generateNumbers()

    var y = arr[index]
    y ^= (y >>> 11)
    y ^= ((y << 7) & 2636928640)
    y ^= ((y << 15) & 4022730752)
    y ^= (y >>> 18)

    index = (index + 1) % 624
    return y
}

function generateNumbers() {
    for (var i = 0; i < 624; i ++) {
        var y = (arr[i] & 0x80000000) + (arr[(i+1) % 624] & 0x7fffffff)
        arr[i] = arr[(i + 397) % 624] ^ (y >>> 1)
        if (y % 2 != 0) arr[i] ^= 2567483615
    }
}

// let's get our seed now from the SE API
var x = new XMLHttpRequest()
x.open('GET', 'http://api.stackexchange.com/2.2/answers?pagesize=10&order=desc&sort=activity&site=stackoverflow&filter=!Sri2UzKb5mTfr.XgjE', false)
x.send(null)
// we've got the answer data, now just add up all the numbers.
// only 4 digits at a time to prevent too big of a number.
var seed = 0
var numbers = x.responseText.match(/\d{0,4}/g)
for (var i = 0; i < numbers.length; i++) seed += +numbers[i]

init(seed)
for (var i = 0; i < 10; i++) console.log(getNumber())

ฉันเขียน Mersenne Twister ใน JS จากนั้นฉันรู้ว่าฉันต้องได้รับเมล็ดจากที่ใดที่หนึ่ง

ดังนั้นฉันตัดสินใจว่าฉันจะได้รับจาก Stack Exchange API! (ฉันสามารถใช้localStorageและเพิ่มตัวนับ แต่ก็ไม่สนุก) ดังนั้นฉันจึงคว้าคำตอบที่ใช้งานล่าสุด 10 อันดับจากนั้นฉันก็ตอบทุก ๆ 4 หรือน้อยกว่านั้นในการตอบกลับและเพิ่มเข้าไป

เมล็ดเหล่านี้แตกต่างกันเสมอเนื่องจาก Stack Overflow อัปเดตอยู่ตลอดเวลา (และโควต้าของฉันลดลงเรื่อย ๆ ) ตัวเลขรวมถึงรหัสคำตอบรหัสคำถามคะแนนขึ้น / ลงจำนวนโหวตตัวแทนตัวแทน / ID และข้อมูลผู้ห่อ (โควต้าและเช่นนั้น ) ในการวิ่งครั้งเดียวฉันได้256845แล้ว270495และ256048อื่น ๆ ....

สิ่งนี้บันทึก 10 หมายเลขสุ่ม 32 บิตสองส่วนเสริมของคอนโซล ตัวอย่างผลลัพธ์:

247701962
-601555287
1363363842
-1184801866
1761791937
-163544156
2021774189
2140443959
1764173996
-1176627822

5

ชวา

import java.util.Random;
import java.util.concurrent.atomic.AtomicLong;

/**
 *
 * @author Quincunx
 */
public class NoTimeRandom extends Random {

    private AtomicLong seed;

    public NoTimeRandom() {
        byte[] ba = (new String[0].toString() + new String[0].toString()
                + new String[0].toString() + new String[0].toString()
                + new String[0].toString() + new String[0].toString()).getBytes();
        int seed1 = 1;
        for (byte b : ba) {
            seed1 += b;
        }

        ba = (new String[0].toString() + new String[0].toString()
                + new String[0].toString() + new String[0].toString()
                + new String[0].toString() + new String[0].toString()).getBytes();
        long seed2 = 1;
        for (byte b : ba) {
            seed2 += b;
        }

        seed = new AtomicLong(seed1 ^ seed2);
    }

    @Override
    protected int next(int bits) {
        long oldseed, newseed;
        AtomicLong seed = this.seed;
        do {
            oldseed = seed.get();
            newseed = (oldseed * 25214903917L + 11) & 281474976710655L;
        } while (!seed.compareAndSet(oldseed, newseed));

        return (int) (newseed >>> (48 - bits));
    }

    public static void main(String[] args) {
        Random r = new NoTimeRandom();

        for (int i = 0; i < 5; i++) {
            System.out.println(r.nextInt());
        }
    }

}

public NoTimeRandom()ความมหัศจรรย์อยู่ใน อาร์เรย์ที่ส่งไปยังสตริงสามารถสร้างความสับสนให้โปรแกรมเมอร์ใหม่เนื่องจากตัวเลขสุ่ม ตัวอย่าง (สำหรับchar[]: [C@4a8e91eb) วิธีการที่คัดลอกมาจากnextjava.util.Random

ตัวอย่างผลลัพธ์:

134277366
467041052
-555611140
-1741034686
1420784423

ลองทดสอบประสิทธิภาพของ rng นี้:

ในคำตอบของฉันโดยประมาณระฆังโค้งการสร้างข้อมูลที่ฉันใช้ขึ้นอยู่กับ rng ที่ดี เรามาเรียกใช้สิ่งนี้ในฐานะ rng เอาท์พุท:

ป้อนคำอธิบายรูปภาพที่นี่

อย่างที่ฉันคิด นี่คือ rng หมัดสวย


5

คอมไพล์ด้วยแฟล็ก -pthread (หรือคอมไพเลอร์ของคุณใช้)

#include <stdio.h>
#include <pthread.h>

#define m (unsigned long)2147483647
#define q (unsigned long)127773
#define a (unsigned int)16807
#define r (unsigned int)2836 

static unsigned long seed;
pthread_t t[20];
int lo, hi, done;

void *pseudorandom(void *id)
{
    while(done)
    {
        int test;
        hi = seed/q;
        lo = seed%q;
        test = a * lo - r * hi;
        if (test > 0) seed = test;
        else seed = test + m;
    }
}

main()
{
     int i;
     seed = 54321;
     done = 1;

     for(i = 0; i < 20; i++) 
     {
          pthread_create(&(t[i]), NULL, &pseudorandom, NULL);
     }

     for (i = 0; i < 10; i++) 
     {
          printf("%lu\n", seed);
     }

     done = 0;
}

ฉันไม่แน่ใจว่าสิ่งนี้มีคุณสมบัติหรือไม่ขึ้นอยู่กับมาตรฐาน "ไม่อนุญาตให้มีเวลา" เพราะโดยพื้นฐานแล้วการใช้ตัวกำหนดตารางเวลาเป็นแหล่งของเอนโทรปีโดยจงใจละเว้นความปลอดภัยของเธรด มันทำงานโดยใช้ฟังก์ชั่นพื้นฐาน psuedo-random ( เครื่องกำเนิดเลขสุ่ม Lehmer ) กับเมล็ดเริ่มต้นที่มีการเข้ารหัสอย่างหนัก จากนั้นจะเริ่ม 20 เธรดที่เรียกใช้การคำนวณ Lehmer ด้วยชุดตัวแปรที่แชร์

ดูเหมือนว่าจะทำงานได้ค่อนข้างดีต่อไปนี้คือการดำเนินการสองอย่างติดต่อกัน:

comintern ~ $ ./a.out
821551271
198866223
670412515
4292256
561301260
1256197345
959764614
874838892
1375885882
1788849800
comintern ~ $ ./a.out
2067099631
953349057
1736873858
267798474
941322622
564797842
157852857
1263164394
399068484
2077423336

แก้ไข: ให้ความคิดอีกเล็กน้อยและตระหนักว่านี่ไม่ใช่เวลาทั้งหมด แม้ว่าเอนโทรปีจะไม่ได้มาจากตัวแบ่งเวลา แต่ก็มาจากการโหลดของกระบวนการที่กำลังทำงานอยู่ทั้งหมดในระบบ

แก้ไข 2 หลังจากรับแรงบันดาลใจจากการโพสต์ @Quincunx ระฆังฉันทิ้ง 12MB ของการสุ่มลงในไฟล์และอัปโหลดไปยังCAcert มันล้มเหลวในการทดสอบมิจฉาทิฐิทั้งหมด แต่ได้ทดสอบระดับ 7.999573 จากทั้งหมด 8 ในการทดสอบ ENT (เฉพาะค่าที่อาจเป็นไปได้ ) อยากรู้อยากเห็นการนับด้ายสองเท่าทำให้แย่ลง


4

มันสร้างตัวเลขแบบสุ่มในช่วง 0-255 โดยการใช้เมล็ดพันธุ์จากhttps://stackoverflow.com/questionswgetใช้

#include <stdio.h>
main()
{
    FILE *file;
    unsigned char c,x;
    system("wget -O - https://stackoverflow.com/questions > quest.html");
    file = fopen ("quest.html", "r");
    while(c=fgetc(file) != EOF) x+=c;
    fclose(file);
    printf("%d",x);
}

วิ่งตัวอย่าง:

C:\Users\izabera>random
--2014-03-02 16:15:28--  https://stackoverflow.com/questions
Resolving stackoverflow.com... 198.252.206.140
Connecting to stackoverflow.com|198.252.206.140|:80... connected.
HTTP request sent, awaiting response... 200 OK
Length: 85775 (84K) [text/html]
Saving to: `STDOUT'

100%[======================================>] 85,775      40.3K/s   in 2.1s

2014-03-02 16:15:31 (40.3 KB/s) - `-' saved [85775/85775]

15 /* <=================== THIS IS THE RANDOM NUMBER */
C:\Users\izabera>random
--2014-03-02 16:15:36--  https://stackoverflow.com/questions
Resolving stackoverflow.com... 198.252.206.140
Connecting to stackoverflow.com|198.252.206.140|:80... connected.
HTTP request sent, awaiting response... 200 OK
Length: 85836 (84K) [text/html]
Saving to: `STDOUT'

100%[======================================>] 85,836      50.0K/s   in 1.7s

2014-03-02 16:15:38 (50.0 KB/s) - `-' saved [85836/85836]

76
C:\Users\izabera>random
--2014-03-02 16:15:56--  https://stackoverflow.com/questions
Resolving stackoverflow.com... 198.252.206.140
Connecting to stackoverflow.com|198.252.206.140|:80... connected.
HTTP request sent, awaiting response... 200 OK
Length: 85244 (83K) [text/html]
Saving to: `STDOUT'

100%[======================================>] 85,244      36.0K/s   in 2.3s

2014-03-02 16:15:59 (36.0 KB/s) - `-' saved [85244/85244]

144

2

C ++

#include<iostream>
int main()
{
    int *ptr=new int,i=0;
    for(;i<5;i++)
    {
        std::cout<<*(ptr+i)<<'\n';
    }
    return 0;
}  

เอาท์พุต

5 หมายเลขสุ่มใด ๆ

สามตัวอย่าง
ป้อนคำอธิบายรูปภาพที่นี่

ป้อนคำอธิบายรูปภาพที่นี่

ป้อนคำอธิบายรูปภาพที่นี่


1
ตัวอย่างที่ 1, ที่ 2 และที่ 5 ใกล้เคียงกันมากรูปแบบเดียวกันซ้ำทั้ง 3 ตัวอย่าง ไม่ใช่ผลลัพธ์ที่คาดหวังจากตัวสร้างตัวเลขสุ่ม
izabera

@izabera เมื่อมันมาถึงพอยน์เตอร์ในการสร้างตัวเลขสุ่ม ... ทุกอย่างขึ้นอยู่กับคอมพิวเตอร์ของคุณ (RAM และโปรเซสเซอร์) บางทีที่อยู่ที่ป้อนโดย 'int ใหม่' เป็น 'ptr' กำลังถูกใช้งานในปัจจุบัน! คุณพยายามเรียกใช้รหัสนี้หรือไม่?
Mukul Kumar

ให้ฉันเพิ่มการเปลี่ยนแปลงเล็กน้อย
Mukul Kumar

ฉันลองตอนนี้บนเครื่องของฉันดูเหมือนว่าฉันจะได้รับสิ่งต่าง ๆ เสมอ11230576, 0, 11206992, 0, 2053725299ซึ่งยังไม่ได้ดูสุ่มสำหรับฉัน
izabera

ตรวจสอบได้ที่ideone
izabera

2

Perl

ขยะทั้งหมดนี้เกี่ยวกับการรับเมล็ดทางอินเทอร์เน็ตคืออะไร? เสียงเหมือนการโกงกับฉัน ;-) ฉันชอบที่จะให้เมล็ดพันธุ์ของฉันแก่ฟังก์ชั่นแฮชการเข้ารหัสลับแทนและให้ผลลัพธ์ในช่วง 0 ถึง 2 ^ 160-1 ดังนี้:

use Digest::SHA1 qw(sha1);
use bigint;
sub r {
  $_ = \3;
  /^.*x([0-9a-f]+).$/;
  hex((unpack "H*", sha1 "some_salt".$1.$$)[0])
}
print join " ", r'

เมื่อใดก็ตามที่คุณมีความไม่แน่นอนเรื่องคุณภาพวิธีการแจกจ่ายมันอย่างสม่ำเสมอ (แต่ไม่เพิ่มคุณภาพ!) ก็คือการส่งมันเข้าไปในไลค์ของ SHA1 หรือ MD5 หรืออย่างที่ฉันเคยทำที่นี่ สำหรับเมล็ดกัญชาก่อนฉันใช้ pid และที่อยู่ของการอ้างอิงแบบสุ่ม แน่นอนคุณสามารถเพิ่มอินพุตอื่น ๆ สำหรับเอนโทรปีมากขึ้นเช่นบน x86 คุณสามารถใช้ TSC - (แต่การใส่รหัสแอสเซมบลีใน perl เป็นบิตของหมีดังนั้นฉันจึงข้าม)

หากคุณต้องการให้ผลลัพธ์ที่แตกต่างจากผู้ชายในคอมพิวเตอร์เครื่องถัดไปเพียงปรับ "some_salt" ให้เป็นสตริงที่คุณชอบ หรือปล่อยให้มันออกมาโดยสิ้นเชิงถ้าคุณเป็น minimalist =)


ฉันเดาว่าฟังก์ชั่นการเข้ารหัสใด ๆ ที่มีค่าชื่อในไลบรารีมาตรฐานจะใช้ RNG ที่ปลอดภัยแบบเข้ารหัสลับภายใน
duci9y

ฉันไม่แน่ใจเกี่ยวกับเรื่องนี้ Digest :: MD5 / Digest :: SHA1 ผลิตผลลัพธ์ที่กำหนดได้อย่างสมบูรณ์และสามารถทำซ้ำได้อย่างสมบูรณ์ดังนั้นมันจึงจำเป็นต้องใช้หมายเลขสุ่มสำหรับ?
skibrianski

ขออภัย! ฉันเพิ่งบินไปตอบและคิดว่าคุณกำลังสร้างกุญแจแทนการย่อย
duci9y

2

ชวา

โซลูชันของฉันละเมิดhashCode()วิธีการObjectเรียน

class G22640 {
    static class Rand {
        public int nextInt() {
            return new Object().hashCode();
        }
    }

    public static void main(String args[]) {
        Rand r = new Rand();
        for (int i = 0; i < 10; i++) {
            System.out.println(r.nextInt());
        }
    }
}

ตัวอย่างผลลัพธ์:

31859448
22101035
11593610
4580332
25736626
32157998
3804398
32440180
19905449
2772678

แรงบันดาลใจจากการแสดงให้เห็นแบบแผนของการแก้ปัญหาอื่น ๆ คำตอบของผมเปลี่ยนวิธีการแก้ปัญหาของฉันจะกลับมาตรงกลาง 16 บิตของส่งกลับโดยintObject.hashCode()

import java.io.*;

class G22640 {
    static class Rand {
        public short nextShort() {
            return (short) ((new Object().hashCode() >> 8) & 0xFFFF);
        }
    }

    public static void main(String args[]) throws IOException {
        Rand r = new Rand();

        for (int i = 0; i < 10; i++) {
            System.out.println(r.nextShort());
        }

        // generateToFile("random_22640.txt");
    }

    private static void generateToFile(String fileName) throws IOException {
        Rand r = new Rand();
        BufferedOutputStream o = new BufferedOutputStream(new FileOutputStream(fileName));

        for (int i = 0; i < 10000000; i++) {
            int a = r.nextShort();
            for (int j = 0; j < 2; j++) {
                o.write(a & 0xFF);
                a >>= 8;
            }
        }

        o.flush();
        o.close();
    }
}

ผมสร้างไฟล์ 19 MB (ประกอบด้วย 10 7 short ) และส่งไปยังCACert นี่คือภาพหน้าจอของผลลัพธ์ (ได้รับการแก้ไขให้ดูดี แต่ตัวเลขยังคงอยู่เหมือนเดิม):

ผลลัพธ์

ฉันรู้สึกประหลาดใจกับผลลัพธ์ที่ได้เพราะมันนาฬิกา 7.999991 ที่การทดสอบของ Entropy และผ่าน (?) การทดสอบ Diehard ทั้ง 7 ครั้ง


2

Javascript
สร้างแบบสุ่มด้วยการเลื่อนเมาส์ของผู้ใช้

var ranArr=[];
var random=0;
var first=second=0;
function generateR(event) {
ranArr.push(parseFloat(event.clientX+document.body.scrollLeft))
ranArr.push(parseFloat(event.clientY+document.body.scrollTop));
var len=ranArr.length;

for(var i=0;i<len;i++) {
    if(i<len/2) {

    first+=ranArr[i];
    } else {
    second += ranArr[i];
    }
}
third = second/first;
third = third+"";
console.log(third.substr(5));
}
document.onmousemove=function(event){generateR(event)};

ข้อมูลที่คัดลอกห้าครั้งล่าสุด:
9637090187003
7828470680762
6045869361238
4220720695015
2422653391073


1

Bash, range: ints ระหว่าง 0 ถึง 1

echo -n & echo "$! % 2" | bc

ดังนั้นคุณหมายถึงมันเลือก 0 หรือ 1 เท่านั้น?

อ๋อ ควรเติมเต็ม "ตัวเลขที่สร้างขึ้นสามารถอยู่ในช่วงใดก็ได้อย่างน้อยสองจำนวนเต็ม: D" ใช่หรือไม่
Keba

ฉันเดาอย่างนั้น คุณคิดว่าคุณสามารถขยายไปสู่ช่วงที่กว้างขึ้นได้หรือไม่?

เพียงแค่echo -n & echo $!จะทำ แต่จะเป็นมาก RNG ไม่ดี นอกจากนี้คุณยังสามารถเปลี่ยน 2 ด้วยหมายเลขอื่น ๆ ได้ แต่ยิ่งจำนวนยิ่งมากเท่าไหร่ยิ่งแย่ลงก็คือ "การสุ่ม"
Keba

ฉันเห็น. ขอบคุณสำหรับคำอธิบาย

1

ทับทิม

น่าเสียดายที่ Mac เท่านั้น เราใช้soxเพื่อดึงไบต์จากไมโครโฟน (เป็นสตริง, อะแฮ่ม ... ), ย้อนกลับเพื่อรับส่วนหัวสถานะในตอนท้าย (* ไอ *), สับมันขึ้นมา, ตัดส่วนหัว, ใช้ MD5 ของชิ้นงาน วางเครื่องหมายที่ไม่ใช่ตัวเลขจากแฮชเพิ่มจำนวนเต็มที่เหลือด้วยกันติด0.ที่ด้านหน้าแปลงให้เป็นทศนิยม

0..1สร้างลอยของความยาวที่แตกต่างกันในช่วงเวลา

require 'open3'
require 'digest'

class InsecureRandom
  def self.random_number
    n = self.get_bytes
    .map! { |r| Digest::MD5.hexdigest(r) }
    .map! { |r| r.gsub(/[a-z]/, '') }
    .map!(&:to_i)
    .reduce(0,:+)

    "0.#{n}".to_f
  end

  private
  def self.get_bytes
    Open3.popen3('sox -d -q -e unsigned-integer -p') do |_, stdout, _|
      stdout.read(20000).reverse.split('\\').to_a.take(20)
    end
  end
end

randomish = Array.new(20) { InsecureRandom.random_number }
puts randomish
# >> 0.2333530765409607
# >> 0.17754047429753905
# >> 0.936039801228352
# >> 0.2781141892158962
# >> 0.6243140263525706
# >> 0.1583419168189452
# >> 0.2173713056635174
# >> 0.930577106355
# >> 0.11215268787922089
# >> 0.13292311877287152
# >> 0.14791818448435443
# >> 0.4864648362730452
# >> 0.5133193113765809
# >> 0.3076637743531015
# >> 0.16060112015793476
# >> 0.7294970251624926
# >> 0.18945368886946876
# >> 0.9970215825154781
# >> 0.13775531752383308
# >> 0.5794383903900283

1

การสร้างแบบสุ่มโดยใช้ ID กระบวนการ

#include <unistd.h>
#include <stdio.h>

int     main(void)
{
    int out;
    out *= out *= out = getpid();
    printf("%d\n", out % 1024);
    return (0);
}

ตัวอย่างผลลัพธ์:

-767
0
769
-1008
337
-768
369
-752
-415
0
-863
784
-463
256
657


0

หลาม

ความรัดกุมของ Python ไม่สิ้นสุดที่จะประหลาดใจ เนื่องจากการใช้ภาพสุ่มของ imgur นั้นไม่ถูกต้องฉันจึงใช้การสุ่มอย่างดี: การแชทของ stackoverflow!

   import urllib.request

def getrand():
    req = urllib.request.Request("http://chat.stackoverflow.com/")
    response = urllib.request.urlopen(req)
    the_page = str(response.read())

    x = 1
    for char in the_page:
        x = (3*x + ord(char) + 1)%2**32

    print(x)

5 การทดลอง:

3258789746
1899058937
3811869909
274739242
1292809118

ไม่สุ่มอย่างแท้จริง แต่ก็ไม่มีอีกต่อไป


ฉันคิดว่ากฎ 2 ไม่อนุญาต URL เช่นwhatever.com/random
izabera

@izabera 2 จากคำตอบอื่น ๆ ที่ใช้?
qwr

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

@izabera ฉันได้เปลี่ยนแหล่งที่มาแบบสุ่มของฉันแล้ว คุณคิดยังไงกับตอนนี้
qwr

ตอนนี้ไม่เป็นไร: D
izabera

0

Perl

ฉันเห็นคำตอบมากมายซึ่งทำให้คำขอ HTTP ซึ่งดูเหมือนจะสิ้นเปลืองกับฉันเพราะภายใต้หน้าปกมีตัวเลขสุ่มที่ส่งผ่านสาย ดังนั้นฉันจึงตัดสินใจที่จะเขียนโค้ดเพื่อปัดรหัสที่ระดับล่าง:

use IO::Socket::INET;
print ((sockaddr_in(getsockname(IO::Socket::INET->new(
    PeerAddr => "google.com", PeerPort => 80, Proto => "tcp"
))))[0]);

ให้พอร์ตสุ่มในช่วง 0..65535 ตามหลักวิชา ในทางปฏิบัติมีหลายพอร์ตที่คุณจะไม่เคยเห็นดังนั้นการกระจายจึงไม่สมบูรณ์ แต่เป็น AFAICT ปริมาณงานที่น้อยที่สุดที่คุณสามารถทำได้เพื่อรับเอนโทรปีจากรีโมตโฮสต์ที่เปิดพอร์ต

ป.ล. - การจัดการข้อผิดพลาดถูกทิ้งไว้เป็นแบบฝึกหัดให้ผู้อ่าน ;-)


0

// alternating two pure-RNG inspired by http://xkcd.com/221/
int getRandomNumber()
{
   static int dice_roll = 0;
   dice_roll++;
   if ((dice_roll % 2) == 1)
   {
      return 4;
   } 
   else
   {
      return 5;
   } 
}

int main(int argc, char **argv)
{
    printf("%d\n%d\n", getRandomNumber(), getRandomNumber())
    return 0;
}
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.