Random number generator (device): Difference between revisions

added RPL
m (A print statement has been added to the program to make it easier for the user to know when to press any key to generate the random number.)
(added RPL)
 
(27 intermediate revisions by 14 users not shown)
Line 6:
 
show how to obtain a random 32-bit number from that mechanism.
 
;Related task
* [[Random_number_generator_(included)]]
<br><br>
 
=={{header|AArch64 Assembly}}==
 
{{works with|aarch64-linux-gnu-as/qemu-aarch64}}
 
Linux provides <code>getrandom</code> syscall for most architectures, which draws random bytes from <code>/dev/urandom</code> by default.
 
The syscall number on AArch64 is 278.
 
<syntaxhighlight lang="arm_assembly">.equ STDOUT, 1
.equ SVC_WRITE, 64
.equ SVC_GETRANDOM, 278
.equ SVC_EXIT, 93
 
.text
.global _start
 
_start:
stp x29, x30, [sp, -32]! // allocate buffer space at [sp]
mov x29, sp
mov x0, sp
mov x1, #4
bl _getrandom // getrandom(&tmp, 4);
ldr w0, [sp]
bl print_uint64 // print_uint64(tmp);
ldp x29, x30, [sp], 32
mov x0, #0
b _exit // exit(0);
 
// void print_uint64(uint64_t x) - print an unsigned integer in base 10.
print_uint64:
// x0 = remaining number to convert
// x1 = pointer to most significant digit
// x2 = 10
// x3 = x0 / 10
// x4 = x0 % 10
// compute x0 divmod 10, store a digit, repeat if x0 > 0
ldr x1, =strbuf_end
mov x2, #10
1: udiv x3, x0, x2
msub x4, x3, x2, x0
add x4, x4, #48
mov x0, x3
strb w4, [x1, #-1]!
cbnz x0, 1b
// compute the number of digits to print, then call write()
ldr x3, =strbuf_end_newline
sub x2, x3, x1
mov x0, #STDOUT
b _write
 
.data
strbuf:
.space 31
strbuf_end:
.ascii "\n"
strbuf_end_newline:
.align 4
 
.text
//////////////// system call wrappers
// ssize_t _write(int fd, void *buf, size_t count)
_write:
mov x8, #SVC_WRITE
svc #0
ret
 
// ssize_t getrandom(void *buf, size_t buflen, unsigned int flags=0)
_getrandom:
mov x2, #0
mov x8, #SVC_GETRANDOM
svc #0
ret
 
// void _exit(int retval)
_exit:
mov x8, #SVC_EXIT
svc #0</syntaxhighlight>
 
=={{header|Ada}}==
random.adb:
<langsyntaxhighlight Adalang="ada">with Ada.Streams.Stream_IO;
with Ada.Text_IO;
procedure Random is
Line 22 ⟶ 103:
Ada.Streams.Stream_IO.Close (Random_File);
Ada.Text_IO.Put_Line ("Number:" & Integer'Image (Number));
end Random;</langsyntaxhighlight>
 
=={{header|ARM Assembly}}==
{{works with|as|Raspberry Pi}}
<syntaxhighlight lang="arm assembly">
 
/* ARM assembly Raspberry PI */
/* program urandom.s */
 
/* Constantes */
.equ STDOUT, 1 @ Linux output console
.equ EXIT, 1 @ Linux syscall
.equ READ, 3
.equ WRITE, 4
.equ OPEN, 5
.equ CLOSE, 6
 
.equ O_RDONLY, 0 @ open for reading only
 
.equ BUFFERSIZE, 4 @ random number 32 bits
 
/* Initialized data */
.data
szFileName: .asciz "/dev/urandom" @ see linux doc
szCarriageReturn: .asciz "\n"
/* datas error display */
szMessErreur: .asciz "Error detected.\n"
szMessErr: .ascii "Error code hexa : "
sHexa: .space 9,' '
.ascii " decimal : "
sDeci: .space 15,' '
.asciz "\n"
/* datas message display */
szMessResult: .ascii "Random number :"
sValue: .space 12,' '
.asciz "\n"
/* UnInitialized data */
.bss
sBuffer: .skip BUFFERSIZE @ buffer result
 
/* code section */
.text
.global main
main:
ldr r0,iAdrszFileName @ File name
mov r1,#O_RDONLY @ flags
mov r2,#0 @ mode
mov r7,#OPEN @ open file
svc #0
cmp r0,#0 @ error ?
ble error
mov r8,r0 @ save FD
mov r4,#0 @ loop counter
1:
mov r0,r8 @ File Descriptor
ldr r1,iAdrsBuffer @ buffer address
mov r2,#BUFFERSIZE @ buffer size
mov r7,#READ @ call system read file
svc 0
cmp r0,#0 @ read error ?
ble error
ldr r1,iAdrsBuffer @ buffer address
ldr r0,[r1] @ display buffer value
ldr r1,iAdrsValue
bl conversion10
ldr r0,iAdrszMessResult
bl affichageMess
add r4,#1 @ increment counter
cmp r4,#10 @ maxi ?
blt 1b @ no -> loop
 
 
end:
mov r0,r8
mov r7, #CLOSE @ call system close file
svc #0
cmp r0,#0
blt error
mov r0,#0 @ return code
b 100f
error:
ldr r1,iAdrszMessErreur @ error message
bl displayError
mov r0,#1 @ return error code
100: @ standard end of the program
mov r7, #EXIT @ request to exit program
svc 0 @ perform system call
iAdrsBuffer: .int sBuffer
iAdrsValue: .int sValue
iAdrszMessResult: .int szMessResult
iAdrszFileName: .int szFileName
iAdrszMessErreur: .int szMessErreur
iAdrszCarriageReturn: .int szCarriageReturn
 
/******************************************************************/
/* display text with size calculation */
/******************************************************************/
/* r0 contains the address of the message */
affichageMess:
push {r0,r1,r2,r7,lr} @ save registers
mov r2,#0 @ counter length */
1: @ loop length calculation
ldrb r1,[r0,r2] @ read octet start position + index
cmp r1,#0 @ if 0 its over
addne r2,r2,#1 @ else add 1 in the length
bne 1b @ and loop
@ so here r2 contains the length of the message
mov r1,r0 @ address message in r1
mov r0,#STDOUT @ code to write to the standard output Linux
mov r7, #WRITE @ code call system "write"
svc #0 @ call system
pop {r0,r1,r2,r7,lr} @ restaur registers
bx lr @ return
/***************************************************/
/* display error message */
/***************************************************/
/* r0 contains error code r1 : message address */
displayError:
push {r0-r2,lr} @ save registers
mov r2,r0 @ save error code
mov r0,r1
bl affichageMess
mov r0,r2 @ error code
ldr r1,iAdrsHexa
bl conversion16 @ conversion hexa
mov r0,r2 @ error code
ldr r1,iAdrsDeci @ result address
bl conversion10S @ conversion decimale
ldr r0,iAdrszMessErr @ display error message
bl affichageMess
100:
pop {r0-r2,lr} @ restaur registers
bx lr @ return
iAdrszMessErr: .int szMessErr
iAdrsHexa: .int sHexa
iAdrsDeci: .int sDeci
/******************************************************************/
/* Converting a register to hexadecimal */
/******************************************************************/
/* r0 contains value and r1 address area */
conversion16:
push {r1-r4,lr} @ save registers
mov r2,#28 @ start bit position
mov r4,#0xF0000000 @ mask
mov r3,r0 @ save entry value
1: @ start loop
and r0,r3,r4 @ value register and mask
lsr r0,r2 @ move right
cmp r0,#10 @ compare value
addlt r0,#48 @ <10 ->digit
addge r0,#55 @ >10 ->letter A-F
strb r0,[r1],#1 @ store digit on area and + 1 in area address
lsr r4,#4 @ shift mask 4 positions
subs r2,#4 @ counter bits - 4 <= zero ?
bge 1b @ no -> loop
 
100:
pop {r1-r4,lr} @ restaur registers
bx lr
/***************************************************/
/* Converting a register to a signed decimal */
/***************************************************/
/* r0 contains value and r1 area address */
conversion10S:
push {r0-r4,lr} @ save registers
mov r2,r1 @ debut zone stockage
mov r3,#'+' @ par defaut le signe est +
cmp r0,#0 @ negative number ?
movlt r3,#'-' @ yes
mvnlt r0,r0 @ number inversion
addlt r0,#1
mov r4,#10 @ length area
1: @ start loop
bl divisionpar10U
add r1,#48 @ digit
strb r1,[r2,r4] @ store digit on area
sub r4,r4,#1 @ previous position
cmp r0,#0 @ stop if quotient = 0
bne 1b
 
strb r3,[r2,r4] @ store signe
subs r4,r4,#1 @ previous position
blt 100f @ if r4 < 0 -> end
 
mov r1,#' ' @ space
2:
strb r1,[r2,r4] @store byte space
subs r4,r4,#1 @ previous position
bge 2b @ loop if r4 > 0
100:
pop {r0-r4,lr} @ restaur registers
bx lr
/***************************************************/
/* division par 10 unsigned */
/***************************************************/
/* r0 dividende */
/* r0 quotient */
/* r1 remainder */
divisionpar10U:
push {r2,r3,r4, lr}
mov r4,r0 @ save value
//mov r3,#0xCCCD @ r3 <- magic_number lower raspberry 3
//movt r3,#0xCCCC @ r3 <- magic_number higter raspberry 3
ldr r3,iMagicNumber @ r3 <- magic_number raspberry 1 2
umull r1, r2, r3, r0 @ r1<- Lower32Bits(r1*r0) r2<- Upper32Bits(r1*r0)
mov r0, r2, LSR #3 @ r2 <- r2 >> shift 3
add r2,r0,r0, lsl #2 @ r2 <- r0 * 5
sub r1,r4,r2, lsl #1 @ r1 <- r4 - (r2 * 2) = r4 - (r0 * 10)
pop {r2,r3,r4,lr}
bx lr @ leave function
iMagicNumber: .int 0xCCCCCCCD
 
</syntaxhighlight>
 
=={{header|Batch File}}==
The dynamic environmental variable <code>%random%</code> contains a number between 0 and 32767.
<langsyntaxhighlight lang="dos">
@echo %random%
</syntaxhighlight>
</lang>
 
=={{header|BBC BASIC}}==
{{works with|BBC BASIC for Windows}}
Requires Windows XP or later.
<langsyntaxhighlight lang="bbcbasic"> SYS "SystemFunction036", ^random%, 4
PRINT ~random%</langsyntaxhighlight>
 
=={{header|C}}==
It works on systems having /dev/urandom, like [[GNU]]/[[Linux]].
 
<langsyntaxhighlight lang="c">#include <stdio.h>
#include <stdlib.h>
 
Line 62 ⟶ 356:
printf("%lu\n", v);
return 0;
}</langsyntaxhighlight>
 
=== {{libheader|BSD libc}} ===
[http://www.openbsd.org/cgi-bin/man.cgi?query=arc4random&apropos=0&sektion=3&manpath=OpenBSD+Current&arch=i386&format=html arc4random()] appeared in [[OpenBSD]] 2.1 and has spread to many [[BSD]] systems. This function runs an ARC4 random number generator that takes entropy from a kernel device. (This kernel device is sysctl kern.arandom in OpenBSD, or /dev/urandom in some other systems.)
 
<langsyntaxhighlight lang="c">#include <inttypes.h> /* PRIu32 */
#include <stdlib.h> /* arc4random */
#include <stdio.h> /* printf */
Line 76 ⟶ 370:
printf("%" PRIu32 "\n", arc4random());
return 0;
}</langsyntaxhighlight>
 
=== {{libheader|OpenSSL}} ===
OpenSSL can generate random numbers. The default generator uses SHA1. For [[Unix]] systems, OpenSSL will gather entropy by reading a kernel device like /dev/urandom, or by using [http://egd.sourceforge.net/ EGD, the Entropy Gathering Daemon]. For other systems, OpenSSL might use a different source of entropy.
 
<langsyntaxhighlight lang="c">#include <inttypes.h>
#include <stdio.h>
 
Line 98 ⟶ 392:
printf("%" PRIu32 "\n", v);
return 0;
}</langsyntaxhighlight>
 
=== Windows ===
{{works with|MinGW}}
 
<langsyntaxhighlight lang="c">#include <stdio.h> /* printf */
#include <windows.h>
#include <wincrypt.h> /* CryptAcquireContext, CryptGenRandom */
Line 125 ⟶ 419:
CryptReleaseContext(p, 0);
return 0;
}</langsyntaxhighlight>
=== debian/linux made from scratch ===
{{works with|GCC}}
<syntaxhighlight lang="c">
#include <stdio.h>
#include <stdlib.h>
 
/*
(C) 2020 J.G.A. Debaere, all rights reserved 2020/10/29
 
Put into Public Domain for individuals only
Tested with NIST, Diehard, Diehard 3.31
gcc -lm ./jpsrand_f.c -o ./jpsrand_f.o
 
dieharder -a -f /tmp/tmp.bin
 
I consider it TRNG,
using Time, Hardddisk and Memory as the hardware component
 
No warranty of any kind, "AS IS"
Last time I tested ( 2021/07/07 ) with dieharder:
rgb_bitdist | 8| 100000| 100|0.99716738| WEAK
rgb_lagged_sum | 3| 1000000| 100|0.99661184| WEAK
Out of 114 tests, rest PASSED
 
Obviously, it changes per run :)
*/
 
unsigned int jps_rand()
{
/* (C) 2020 J.G.A. Debaere, all rights reserved */
#include <dirent.h>
 
#include <sys/time.h>
 
struct timeval current_time ;
DIR *folder ;
struct dirent *en ;
folder = opendir ( "." ) ;
 
while ( ( folder ) && ( en = readdir ( folder ) ) != NULL )
 
asm ( "nop" ) ;
closedir ( folder ) ;
gettimeofday( &current_time, NULL ) ;
unsigned int t = ( current_time.tv_sec * current_time.tv_usec / 17.17 ) ;
return t ;
}
 
int main()
{
FILE * f1;
 
f1 = fopen("/tmp/tmp.bin", "wb");
 
 
unsigned int t = ( unsigned int ) jps_rand() ;
for ( unsigned int k = 0; k < 40000000 ; k++ )
{
t = jps_rand () ;
 
fwrite ( &t, sizeof( unsigned int ), 1, f1 ) ;
}
fflush(f1);
fclose(f1);
return 0;
}
 
</syntaxhighlight>
 
JPD 2021/07/07
 
Output:
 
Random
 
== {{header|C++}} ==
<code>std::random_device</code> is a uniformly-distributed integer random number generator that produces non-deterministic random numbers.
 
Line 134 ⟶ 521:
See the C++ section on [[Random_number_generator_(included)#C.2B.2B|Random number generator (included)]] for the list of pseudo-random number engines available.
{{works with|C++11}}
<langsyntaxhighlight lang="cpp">#include <iostream>
#include <random>
Line 143 ⟶ 530:
std::cout << "Random Number: " << dist(rd) << std::endl;
}</langsyntaxhighlight>
 
=={{header|C sharp}}==
<langsyntaxhighlight lang="csharp">using System;
using System.Security.Cryptography;
 
Line 159 ⟶ 546:
 
return result;
}</langsyntaxhighlight>
 
Park-Miller random number generator
<langsyntaxhighlight lang="csharp">
const long m = 2147483647L;
const long a = 48271L;
Line 188 ⟶ 575:
arr[i] = gen();
}
}</langsyntaxhighlight>
 
== {{header|ChucK}} ==
<langsyntaxhighlight lang="c"> Math.random2(-(Math.random()),Math.random(); </langsyntaxhighlight>
 
=={{header|Common Lisp}}==
<langsyntaxhighlight lang="lisp">(defun random-int32 ()
(with-open-file (s "/dev/random" :element-type '(unsigned-byte 32))
(read-byte s)))</langsyntaxhighlight>
 
 
=={{header|D}}==
Example of MersenneTwisterEngine for generating uniformly-distributed 32-bit numbers with a period of 2 to the power of 19937.
<syntaxhighlight lang="d">
<lang d>
import std.stdio;
import std.random;
Line 212 ⟶ 598:
writeln(n);
}
</syntaxhighlight>
</lang>
 
{{out}}
Line 221 ⟶ 607:
run 4: ...
</pre>
=={{header|Delphi}}==
==={{header|Windows}}===
{{libheader| System.SysUtils}}
{{libheader| Winapi.WinCrypt}}[[https://github.com/magicxor/WinCryptographyAPIs]]
<syntaxhighlight lang="delphi">
program Random_number_generator;
 
{$APPTYPE CONSOLE}
 
uses
System.SysUtils,
Winapi.WinCrypt;
 
var
hCryptProv: NativeUInt;
i: Byte;
UserName: PChar;
 
function Random: UInt64;
var
pbData: array[0..7] of byte;
i: integer;
begin
if not CryptGenRandom(hCryptProv, 8, @pbData[0]) then
exit(0);
Result := 0;
for i := 0 to 7 do
Result := Result + (pbData[i] shl (8 * i));
end;
 
procedure Randomize;
begin
CryptAcquireContext(hCryptProv, UserName, nil, PROV_RSA_FULL, 0);
end;
 
begin
Randomize;
for i := 0 to 9 do
Writeln(Random);
Readln;
end.</syntaxhighlight>
{{out}}
<pre>6246170830
2020144138
5469928375
5580575688
3947181392
4671237100
4269461866
4842880207
4217687233
1714028876</pre>
==={{header|Linux}}===
See [[#Pascal]].
=={{header|EchoLisp}}==
No random device provided by the host (browser). But we can use the system timer to get a physical input.
<langsyntaxhighlight lang="lisp">
(random-seed "simon")
(random (expt 2 32)) → 2275215386
Line 235 ⟶ 674:
(random-seed (current-time-milliseconds ))
(random (expt 2 32)) → 1322611152
</syntaxhighlight>
</lang>
 
=={{header|Factor}}==
Factor has good support for switching between different random number generators. <code>with-system-random</code> is a combinator that encapsulates the task of using a system RNG (/dev/random in the case of GNU/Linux).
<langsyntaxhighlight lang="factor">USE: random
[ random-32 ] with-system-random .</langsyntaxhighlight>
 
=={{header|Forth}}==
<langsyntaxhighlight lang="forth">variable rnd
 
: randoms ( n -- )
Line 251 ⟶ 690:
rnd @ .
loop
close-file throw ;</langsyntaxhighlight>
 
=={{header|Fortran}}==
Using system /dev/urandom in [[GNU]]/[[Linux]].
 
<langsyntaxhighlight lang="fortran">
!-----------------------------------------------------------------------
! Test Linux urandom in Fortran
Line 281 ⟶ 720:
 
end program urandom_test
</syntaxhighlight>
</lang>
 
Here's an example of the use of the latter:
 
=={{header|FreeBASIC}}==
FreeBASIC can in theory use any C library to produce pseudo-random numbers including those which are partly device based.
 
However, in practice, there is little need for this as specifying a second parameter of 5 to FB's Randomize statement produces cryptographically strong pseudo-random numbers using either the Win32 Crypto API or the /dev/urandom device under Linux.
<langsyntaxhighlight lang="freebasic">' FB 1.05.0 Win64
 
Randomize , 5
Line 297 ⟶ 737:
Next
 
Sleep</langsyntaxhighlight>
 
 
=={{header|FutureBasic}}==
FB offers a variety of ways to generate random numbers of varying degrees of distribution and randomness accuracy. In addition to its native rnd() function which returns random integers from 1 and higher, it can also access any C library function, i.e, rand(), arc4random, arc4random_uniform, as well as random number generators in Apple's GameplayKit library. Here are a few examples:
<syntaxhighlight lang="freebasic">
include "Tlbx GameplayKit.incl"
 
local fn RandomBigInteger( digits as UInt64 ) as UInt64
end fn = fn GKLinearCongruentialRandomSourceSeed( fn GKLinearCongruentialRandomSourceInit ) mod digits
 
local fn RandomIntegerInRange( min as UInt64, max as UInt64 ) as UInt64
UInt64 rndIntInRange = fn RandomBigInt( max - min + 1 ) + min - 1
end fn = rndIntInRange
 
local fn ArcRandomIntegerInRage( min as long, max as long ) as long
long i
cln i = (arc4random()%(max-min+1))+min;
end fn = fn floor(i)
 
// Returns double in range of 0.0 to 50.0
double r
cln r = (((double)arc4random()/0x100000000)*50);
 
randomInteger = rnd(expr%)
</syntaxhighlight>
 
 
=={{header|GlovePIE}}==
<langsyntaxhighlight lang="glovepie">var.rand=random(10)</langsyntaxhighlight>
 
=={{header|Go}}==
In the Go library is crypto/rand, a source specified to use dev/urandom on Unix-like systems and the CryptGenRandom API on Windows. Also implemented here is a source using dev/random, if you really want it. On my system it would print a few numbers then hang until I moved the mouse or pressed some keys on the keyboard.
<langsyntaxhighlight lang="go">package main
 
import (
Line 337 ⟶ 803:
}
fmt.Println()
}</langsyntaxhighlight>
 
=={{header|Groovy}}==
Based, necessarily, on Java solution:
<langsyntaxhighlight lang="groovy">def rng = new java.security.SecureRandom()</langsyntaxhighlight>
 
Test:
<langsyntaxhighlight lang="groovy">(0..4).each { println rng.nextInt() }</langsyntaxhighlight>
 
{{out}}
Line 352 ⟶ 818:
1152610574
714616658</pre>
 
=={{header|Haskell}}==
{{libheader|Entropy}}
{{Works with|GHC|7.4.1}}
<syntaxhighlight lang="haskell">#!/usr/bin/env runhaskell
 
import System.Entropy
import Data.Binary.Get
import qualified Data.ByteString.Lazy as B
 
main = do
bytes <- getEntropy 4
print (runGet getWord32be $ B.fromChunks [bytes])</syntaxhighlight>
 
=={{header|Icon}} and {{header|Unicon}}==
Line 357 ⟶ 836:
The following is Unicon-specific but trivially converted into Icon.
 
<langsyntaxhighlight lang="unicon">procedure main(A)
n := integer(A[1])|5
every !n do write(rand(4))
Line 368 ⟶ 847:
close(f)
return x
end</langsyntaxhighlight>
 
Sample runs:
Line 384 ⟶ 863:
 
Untested:
<langsyntaxhighlight lang="j">256#.a.i.1!:11'/dev/urandom';0 4</langsyntaxhighlight>
 
Fallback:
<langsyntaxhighlight lang="j">256#.a.i.4{.host'dd if=/dev/urandom bs=4 count=1'</langsyntaxhighlight>
 
Note: this assumes that J is running on linux.
 
=={{header|Java}}==
<langsyntaxhighlight lang="java">import java.security.SecureRandom;
 
public class RandomExample {
Line 401 ⟶ 880:
System.out.println(rng.nextInt());
}
}</langsyntaxhighlight>
 
=={{header|Joy}}==
<syntaxhighlight lang="joy">DEFINE sysrand32 ==
"/dev/urandom" "r" fopen dup 4 fread swap fclose unswons [swap 256 * +] fold.</syntaxhighlight>
 
=={{header|jq}}==
jq does not provide direct access to /dev/urandom, sobut init theis followingquite we assume the availability of `od`, `tr`, and `fold`, and illustrate howstraightforward to producedo an indefinitely long stream of pseudo-random numbers that are approximately uniformly distributed in the range [0,1]so.
We consider two cases: uniform distribution on the interval [0,1] and on the set of non-negative integers less than a given N.
 
===Uniform distribution on an interval===
We assume the availability of `od`, `tr`, and `fold`, and illustrate how to produce an indefinitely long stream of pseudo-random numbers that are approximately uniformly distributed in the range [0,1].
 
Assuming the jq program shown below is in a file named uniform.jq, the command-line invocation would be:
<pre>od -t x -An /dev/urandom | tr -d " " | fold -w 8 | jq -R -f uniform.jq</pre>
 
<langsyntaxhighlight lang="jq"># allow both upper and lower-case characters
def hex2integer:
explode
Line 419 ⟶ 906:
| .[1];
 
select(length>0) | hex2integer / pow(16;length)</langsyntaxhighlight>
 
Notice that the program automatically adjusts the precision based on the length of the hexadecimal numbers presented. Since jq uses IEEE 754 64-bit arithmetic, specifying a larger value to `fold`, such as 10, will produce more precise results.
 
===Uniform distribution on a range of integers===
<syntaxhighlight lang="sh">< /dev/random tr -cd '0-9' | fold -w 1 | jq -Mn '
 
# Output: a PRN in range(0;$n) where $n is .
def prn:
if . == 1 then 0
else . as $n
| (($n-1)|tostring|length) as $w
| [limit($w; inputs)] | join("") | tonumber
| if . < $n then . else ($n | prn) end
end;
 
100 | prn
'</syntaxhighlight>
 
=={{header|Julia}}==
{{works with|Linux}}
<syntaxhighlight lang="julia">
<lang Julia>
const rdev = "/dev/random"
rstream = try
Line 440 ⟶ 943:
println("The hardware random number stream, ", rdev, ", was unavailable.")
end
</syntaxhighlight>
</lang>
 
{{out}}
Line 446 ⟶ 949:
A hardware random number is: 986109744
</pre>
 
=={{header|Haskell}}==
{{libheader|Entropy}}
{{Works with|GHC|7.4.1}}
<lang haskell>#!/usr/bin/env runhaskell
 
import System.Entropy
import Data.Binary.Get
import qualified Data.ByteString.Lazy as B
 
main = do
bytes <- getEntropy 4
print (runGet getWord32be $ B.fromChunks [bytes])</lang>
 
=={{header|Kotlin}}==
<langsyntaxhighlight lang="scala">// version 1.1.2
 
import java.security.SecureRandom
Line 472 ⟶ 962:
rng.setSeed(newSeed) // reseed using the previous 2 random numbers
println(rng.nextInt()) // get random 32-bit number and print it
}</langsyntaxhighlight>
 
=={{header|Lasso}}==
<langsyntaxhighlight lang="lasso">file(`/dev/urandom`)->readSomeBytes(4)->export32bits</langsyntaxhighlight>
{{out}}
<pre>723217350</pre>
 
=={{header|M2000 Interpreter}}==
<syntaxhighlight lang="m2000 interpreter">
<lang M2000 Interpreter>
Module checkit {
Declare random1 lib "advapi32.SystemFunction036" {long lpbuffer, long length}
Line 491 ⟶ 981:
}
checkit
</syntaxhighlight>
</lang>
 
 
<syntaxhighlight lang="m2000 interpreter">
<lang M2000 Interpreter>
Function Random2 {
Declare CryptAcquireContext Lib "advapi32.CryptAcquireContextW" {long ByRefhProv, pszContainer$,pszProvider$, long dwProvType, long dwFlags}
Line 509 ⟶ 999:
}
Print Random2()
</syntaxhighlight>
</lang>
 
=={{header|Mathematica}}==
<lang Mathematica>rand32[] := RandomInteger[{-2^31, 2^31 - 1}]</lang>
 
=={{header|Mathematica}}/{{header|Wolfram Language}}==
<syntaxhighlight lang="mathematica">rand32[] := RandomInteger[{-2^31, 2^31 - 1}]</syntaxhighlight>
Example: create array of 10 rand32 numbers
<langsyntaxhighlight Mathematicalang="mathematica">Table[rand32[], {i, 1, 10}]</langsyntaxhighlight>
 
{{out}}
<pre>{355587317, -869860319, -91421859, 1605907693, 101463390, 891823090,
-531713717, -1038608428, 1717313407, 674189312}</pre>
 
=={{header|Mercury}}==
For versions of Mercury greater than 20.06, the standard library module <tt>random.system_rng</tt> provides access to a platform specific random data source.<br />
 
Generates unsigned 32-bit integers.
 
<syntaxhighlight lang="mercury">:- module random_number_device.
:- interface.
 
:- import_module io.
:- pred main(io::di, io::uo) is det.
 
:- implementation.
:- import_module maybe, random, random.system_rng, require.
 
main(!IO) :-
open_system_rng(MaybeRNG, !IO),
(
MaybeRNG = ok(RNG),
random.generate_uint32(RNG, U32, !IO),
io.print_line(U32, !IO),
close_system_rng(RNG, !IO)
;
MaybeRNG = error(ErrorMsg),
io.stderr_stream(Stderr, !IO),
io.print_line(Stderr, ErrorMsg, !IO),
io.set_exit_status(1, !IO)
).</syntaxhighlight>
 
=={{header|NetRexx}}==
{{Works with|Mac OS X}} and probably other UNIX systems that provide <tt>/dev/random</tt> or <tt>/dev/urandom</tt> random data source devices.<br />
<langsyntaxhighlight NetRexxlang="netrexx">/* NetRexx */
options replace format comments java crossref savelog symbols binary
 
Line 555 ⟶ 1,071:
for ((i=0; i<10; ++i)); do java <program_name>; done # Shell loop to run the command 10 times
*/
</syntaxhighlight>
</lang>
{{out}}
<pre>
Line 573 ⟶ 1,089:
 
=={{header|Nim}}==
<langsyntaxhighlight lang="nim">var f = open("/dev/urandom")
var r: int32
discard f.readBuffer(addr r, 4)
close(f)
echo r</langsyntaxhighlight>
 
=={{header|OCaml}}==
Line 583 ⟶ 1,099:
OCaml's default integers are 31 bits on 32 bits architectures:
 
<langsyntaxhighlight lang="ocaml">let input_rand_int ic =
let i1 = int_of_char (input_char ic)
and i2 = int_of_char (input_char ic)
Line 595 ⟶ 1,111:
close_in ic;
Printf.printf "%d\n" ri31;
;;</langsyntaxhighlight>
 
but if we really want 32 bits integers there is a module for this:
 
<langsyntaxhighlight lang="ocaml">let input_rand_int32 ic =
let i1 = Int32.of_int (int_of_char (input_char ic))
and i2 = Int32.of_int (int_of_char (input_char ic))
Line 614 ⟶ 1,130:
close_in ic;
Printf.printf "%ld\n" ri32;
;;</langsyntaxhighlight>
 
=={{header|PARI/GP}}==
It works on systems having /dev/urandom and Linux.
 
<langsyntaxhighlight lang="parigp">rnd(n=10)=extern("cat /dev/urandom|tr -dc '[:digit:]'|fold -w"n"|head -1")</langsyntaxhighlight>
 
The code above creates a new function rnd() which returns cryptographically strong integers with max. 10 random digits from /dev/urandom. rnd(n) returns integer with max. n random digits. No leading zeros.
Line 631 ⟶ 1,147:
=={{header|Pascal}}==
This works with FreePascal on "unixoids":
<langsyntaxhighlight lang="pascal">program RandomNumberDevice;
var
byteFile: file of byte;
Line 642 ⟶ 1,158:
writeln('The random byte is: ', randomByte);
end.
</syntaxhighlight>
</lang>
{{out}}
<pre>
Line 653 ⟶ 1,169:
=={{header|Perl}}==
Typically one would use a module as they will work on UNIX, Win32, and other O/S's. Crypt::Random::Seed, for instance, will use Win32 sources, EGD/PRNGD, /dev/u?random, or if none of those exist for some reason, a userspace entropy method.
<langsyntaxhighlight Perllang="perl">use Crypt::Random::Seed;
my $source = Crypt::Random::Seed->new( NonBlocking => 1 ); # Allow non-blocking sources like /dev/urandom
print "$_\n" for $source->random_values(10); # A method returning an array of 32-bit values</langsyntaxhighlight>
or (similar but many more dependencies):
<langsyntaxhighlight Perllang="perl">use Crypt::Random::Source qw/get_weak/; # Alternately get_strong
print unpack('L*',get_weak(4)), "\n" for 1..10;</langsyntaxhighlight>
 
Or we can read values from /dev/urandom ourselves:
<langsyntaxhighlight Perllang="perl">sub read_random {
my $device = '/dev/urandom';
open my $in, "<:raw", $device # :raw because it's not unicode string
Line 670 ⟶ 1,186:
}
 
print "$_\n" for read_random(10);</langsyntaxhighlight>
Whether /dev/urandom is good enough for cryptographic work is debated, though on most UNIX systems it is at least as good as the Win32 Crypto API.
 
=={{header|Perl 6}}==
{{Works with|rakudo|2016-11}}
 
A lazy list of random numbers:
 
<lang perl6>use experimental :pack;
my $UR = open("/dev/urandom", :bin) orelse .die;
my @random-spigot = $UR.read(1024).unpack("L*") ... *;
 
.say for @random-spigot[^10];</lang>
{{out}}
<pre>1431009271
1702240522
670020272
588612037
1864913839
2155430433
1690056587
385405103
2366495746
692037942</pre>
 
=={{header|Phix}}==
{{todo|Phix|Test once 0.8.0 is released.}}
My machine does not support the rdrand instruction.<br>
Tested as best I can by commenting out the jnc instructions and replacing rdrand with rdtsc.<br>
Line 705 ⟶ 1,198:
For completeness, I have shown how to convert the signed result to an unsigned one.
 
<!--<syntaxhighlight lang="phix">(notonline)-->
<lang Phix>integer res -- 1=failure, 0=success
<span style="color: #004080;">integer</span> <span style="color: #000000;">res</span> <span style="color: #000080;font-style:italic;">-- 1=failure, 0=success</span>
atom rint = 0 -- random 32-bit int
<span style="color: #004080;">atom</span> <span style="color: #000000;">rint</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">0</span> <span style="color: #000080;font-style:italic;">-- random 32-bit int</span>
#ilASM{
mov eax,1
cpuid
bt ecx,30
mov edi,1 -- exit code: failure
jnc :exit
-- rdrand sets CF=0 if no random number
-- was available. Intel documentation
-- recommends 10 retries in a tight loop
mov ecx,11
::loop1
sub ecx, 1
jz :exit -- exit code is set already
rdrand eax
-- (the above generates exception #C000001D if not supported)
-- rdtsc
jnc :loop1
lea edi,[rint]
call :%pStoreMint
xor edi,edi
::exit
mov [res],edi
xor ebx,ebx -- important!
}
<span style="color: #0000FF;">?{</span><span style="color: #000000;">res</span><span style="color: #0000FF;">,</span><span style="color: #000000;">rint</span><span style="color: #0000FF;">}</span>
<span style="color: #008080;">if</span> <span style="color: #000000;">res</span><span style="color: #0000FF;">=</span><span style="color: #000000;">0</span> <span style="color: #008080;">then</span> <span style="color: #000080;font-style:italic;">-- (success)
--
-- To convert a signed 32-bit int to an unsigned one:
--
-- method 1
-- atom urint1 = rint
-- if urint1&lt;0 then urint1+=#100000000 end if</span>
<span style="color: #004080;">atom</span> <span style="color: #000000;">urint1</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">rint</span><span style="color: #0000FF;">+</span><span style="color: #008080;">iff</span><span style="color: #0000FF;">(</span><span style="color: #000000;">rint</span><span style="color: #0000FF;"><</span><span style="color: #000000;">0</span><span style="color: #0000FF;">?</span><span style="color: #000000;">#100000000</span><span style="color: #0000FF;">:</span><span style="color: #000000;">0</span><span style="color: #0000FF;">)</span>
<span style="color: #000080;font-style:italic;">-- method 2</span>
<span style="color: #004080;">atom</span> <span style="color: #000000;">pMem</span> <span style="color: #0000FF;">=</span> <span style="color: #7060A8;">allocate</span><span style="color: #0000FF;">(</span><span style="color: #000000;">4</span><span style="color: #0000FF;">)</span>
<span style="color: #7060A8;">poke4</span><span style="color: #0000FF;">(</span><span style="color: #000000;">pMem</span><span style="color: #0000FF;">,</span><span style="color: #000000;">rint</span><span style="color: #0000FF;">)</span>
<span style="color: #004080;">atom</span> <span style="color: #000000;">urint2</span> <span style="color: #0000FF;">=</span> <span style="color: #7060A8;">peek4u</span><span style="color: #0000FF;">(</span><span style="color: #000000;">pMem</span><span style="color: #0000FF;">)</span>
<span style="color: #7060A8;">free</span><span style="color: #0000FF;">(</span><span style="color: #000000;">pMem</span><span style="color: #0000FF;">)</span>
<span style="color: #000080;font-style:italic;">-- method 3</span>
<span style="color: #004080;">atom</span> <span style="color: #000000;">urint3</span> <span style="color: #0000FF;">=</span> <span style="color: #7060A8;">bytes_to_int</span><span style="color: #0000FF;">(</span><span style="color: #7060A8;">int_to_bytes</span><span style="color: #0000FF;">(</span><span style="color: #000000;">rint</span><span style="color: #0000FF;">,</span><span style="color: #000000;">4</span><span style="color: #0000FF;">),</span><span style="color: #000000;">signed</span><span style="color: #0000FF;">:=</span><span style="color: #004600;">false</span><span style="color: #0000FF;">)</span>
<span style="color: #0000FF;">?{</span><span style="color: #000000;">urint1</span><span style="color: #0000FF;">,</span><span style="color: #000000;">urint2</span><span style="color: #0000FF;">,</span><span style="color: #000000;">urint3</span><span style="color: #0000FF;">}</span>
<span style="color: #008080;">end</span> <span style="color: #008080;">if</span>
<!--</syntaxhighlight>-->
 
#ilASM{
mov eax,1
cpuid
bt ecx,30
mov edi,1 -- exit code: failure
jnc :exit
 
-- rdrand sets CF=0 if no random number
-- was available. Intel documentation
-- recommends 10 retries in a tight loop
mov ecx,11
::loop1
sub ecx, 1
jz :exit -- exit code is set already
rdrand eax
-- (the above generates exception #C000001D if not supported)
-- rdtsc
jnc :loop1
 
lea edi,[rint]
call :%pStoreMint
xor edi,edi
 
::exit
mov [res],edi
xor ebx,ebx -- important!
}
 
?{res,rint}
 
if res=0 then -- (success)
 
--
-- To convert a signed 32-bit int to an unsigned one:
--
-- method 1
-- atom urint1 = rint
-- if urint1<0 then urint1+=#100000000 end if
atom urint1 = rint+iff(rint<0?#100000000:0)
 
-- method 2
atom pMem = allocate(4)
poke4(pMem,rint)
atom urint2 = peek4u(pMem)
free(pMem)
 
-- method 3
atom urint3 = bytes_to_int(int_to_bytes(rint,4),signed:=false)
 
?{urint1,urint2,urint3}
 
end if</lang>
A linux-only solution:
<!--<syntaxhighlight lang="phix">(notonline)-->
<lang Phix>integer fn = open("/dev/urandom","rb")
<span style="color: #004080;">integer</span> <span style="color: #000000;">fn</span> <span style="color: #0000FF;">=</span> <span style="color: #7060A8;">open</span><span style="color: #0000FF;">(</span><span style="color: #008000;">"/dev/urandom"</span><span style="color: #0000FF;">,</span><span style="color: #008000;">"rb"</span><span style="color: #0000FF;">)</span>
if fn=-1 then
<span style="color: #008080;">if</span> <span style="color: #000000;">fn</span><span style="color: #0000FF;">=-</span><span style="color: #000000;">1</span> <span style="color: #008080;">then</span>
puts(1,"cannot open /dev/urandom\n")
<span style="color: #7060A8;">puts</span><span style="color: #0000FF;">(</span><span style="color: #000000;">1</span><span style="color: #0000FF;">,</span><span style="color: #008000;">"cannot open /dev/urandom\n"</span><span style="color: #0000FF;">)</span>
else
<span style="color: #008080;">else</span>
sequence s = {}
<span style="color: #004080;">sequence</span> <span style="color: #000000;">s</span> <span style="color: #0000FF;">=</span> <span style="color: #0000FF;">{}</span>
for i=1 to 4 do
<span style="color: #008080;">for</span> <span style="color: #000000;">i</span><span style="color: #0000FF;">=</span><span style="color: #000000;">1</span> <span style="color: #008080;">to</span> <span style="color: #000000;">4</span> <span style="color: #008080;">do</span>
s &= getc(fn)
<span style="color: #000000;">s</span> <span style="color: #0000FF;">&=</span> <span style="color: #7060A8;">getc</span><span style="color: #0000FF;">(</span><span style="color: #000000;">fn</span><span style="color: #0000FF;">)</span>
end for
<span style="color: #008080;">end</span> <span style="color: #008080;">for</span>
close(fn)
<span style="color: #7060A8;">close</span><span style="color: #0000FF;">(</span><span style="color: #000000;">fn</span><span style="color: #0000FF;">)</span>
?bytes_to_int(s,signed:=false)
<span style="color: #0000FF;">?</span><span style="color: #7060A8;">bytes_to_int</span><span style="color: #0000FF;">(</span><span style="color: #000000;">s</span><span style="color: #0000FF;">,</span><span style="color: #000000;">signed</span><span style="color: #0000FF;">:=</span><span style="color: #004600;">false</span><span style="color: #0000FF;">)</span>
end if</lang>
<span style="color: #008080;">end</span> <span style="color: #008080;">if</span>
<!--</syntaxhighlight>-->
 
=={{header|PicoLisp}}==
<langsyntaxhighlight PicoLisplang="picolisp">: (in "/dev/urandom" (rd 4))
-> 2917110327</langsyntaxhighlight>
 
=={{header|PowerShell}}==
<syntaxhighlight lang="powershell">
<lang PowerShell>
function Get-RandomInteger
{
Line 810 ⟶ 1,308:
}
}
</syntaxhighlight>
</lang>
<syntaxhighlight lang="powershell">
<lang PowerShell>
4,8,16,32,64,128 | Get-RandomInteger | Format-Wide {$_} -Column 6 -Force
</syntaxhighlight>
</lang>
{{Out}}
<pre>
Line 819 ⟶ 1,317:
</pre>
As hexadecimal:
<syntaxhighlight lang="powershell">
<lang PowerShell>
4,8,16,32,64,128 | Get-RandomInteger | Format-Wide {"0x{0:X}" -f $_} -Column 6 -Force
</syntaxhighlight>
</lang>
{{Out}}
<pre>
Line 829 ⟶ 1,327:
=={{header|ProDOS}}==
Uses math module:
<syntaxhighlight lang ProDOS="prodos">printline -random- </langsyntaxhighlight>
 
=={{header|PureBasic}}==
PureBasic has the source for the random data is the "/dev/urandom" device on Linux or Mac OSX and the "Microsoft Cryptography API" on Windows.
<langsyntaxhighlight PureBasiclang="purebasic">If OpenCryptRandom()
MyRandom = CryptRandom(#MAXLONG)
CloseCryptRandom()
EndIf</langsyntaxhighlight>
 
=={{header|Python}}==
<langsyntaxhighlight Pythonlang="python">import random
rand = random.SystemRandom()
rand.randint(1,10)</langsyntaxhighlight>
 
=={{header|Racket}}==
<syntaxhighlight lang="racket">
<lang Racket>
#lang racket
;; Assuming a device to provide random bits:
(call-with-input-file* "/dev/random"
(λ(i) (integer-bytes->integer (read-bytes 4 i) #f)))
</syntaxhighlight>
</lang>
 
=={{header|Raku}}==
(formerly Perl 6)
{{Works with|rakudo|2016-11}}
 
A lazy list of random numbers:
 
<syntaxhighlight lang="raku" line>use experimental :pack;
my $UR = open("/dev/urandom", :bin) orelse .die;
my @random-spigot = $UR.read(1024).unpack("L*") ... *;
 
.say for @random-spigot[^10];</syntaxhighlight>
{{out}}
<pre>1431009271
1702240522
670020272
588612037
1864913839
2155430433
1690056587
385405103
2366495746
692037942</pre>
 
=={{header|REXX}}==
Line 856 ⟶ 1,378:
Note: &nbsp; the REXX &nbsp; '''random''' &nbsp; BIF has a maximum range
of &nbsp; 100,000.
<langsyntaxhighlight lang="rexx">/*REXX program generates and displays a random 32-bit number using the RANDOM BIF.*/
numeric digits 10 /*ensure REXX has enough decimal digits*/
_=2**16 /*a handy─dandy constant to have around*/
r#= random(0, _-1) * _ + random(0, _-1) /*generate an unsigned 32-bit random #.*/
say r# /*stick a fork in it, we're all done. */</langsyntaxhighlight>
{{out}}
<pre>
Line 868 ⟶ 1,390:
===version 2===
This program generates a random 4 byte character string in the range '00000000'x to 'ffffffff'x
<langsyntaxhighlight lang="rexx">left=0
rite=0
lo=hex(left)hex(rite)
Line 881 ⟶ 1,403:
Say 'high ' c2x(hi)
Exit
hex: Return d2c(arg(1),2)</langsyntaxhighlight>
{{out}}
<pre>low 00000000
Line 888 ⟶ 1,410:
 
=={{header|Ring}}==
<langsyntaxhighlight lang="ring">
nr = 10
for i = 1 to nr
see random(i) + nl
next
</syntaxhighlight>
</lang>
 
=={{header|RPL}}==
RAND 2 32 ^ * FLOOR
 
=={{header|Ruby}}==
Ruby 1.8.7 introduces the 'securerandom' library. For [[MRI]] users, this library tries to get random numbers by loading OpenSSL, or opening /dev/urandom, or calling CryptGenRandom.
 
<syntaxhighlight lang="ruby">require 'securerandom'
{{works with|Ruby|1.8.7}}
SecureRandom.random_number(1 << 32)
<lang Ruby>require 'securerandom'
 
SecureRandom.random_number(1 << 32)</lang>
#or specifying SecureRandom as the desired RNG:
p (1..10).to_a.sample(3, random: SecureRandom) # =>[1, 4, 5]
</syntaxhighlight>
 
=={{header|Rust}}==
<code>rand</code> used to be part of Rust standard library but it was extracted as a 'crate' (https://crates.io/crates/rand). <code>OsRng</code> uses the appropriate device for many platforms including Unix, Windows, BSD, and iOS (listed [https://docs.rs/rand/0.4/rand/os/struct.OsRng.html here]). Other methods like <code>RDRAND</code> can be found in other crates (https://crates.io/crates/rdrand).
 
<langsyntaxhighlight lang="rust">extern crate rand;
 
use rand::{OsRng, Rng};
Line 918 ⟶ 1,446:
let rand_num: u32 = rng.gen();
println!("{}", rand_num);
}</langsyntaxhighlight>
 
=={{header|Scala}}==
<langsyntaxhighlight Scalalang="scala">import java.security.SecureRandom
 
object RandomExample extends App {
Line 929 ⟶ 1,457:
println(this.nextInt()) // get random 32-bit number and print it
}
}</langsyntaxhighlight>
 
=={{header|Sidef}}==
<langsyntaxhighlight lang="ruby">func urandom() {
conststatic device = %f'/dev/urandom';
 
device.open('<:raw', \var fh, \var err) ->
|| die "Can't open `#{device}': #{err}";
 
fh.sysread(\var noise, 4);
'L'.unpack(noise);
}
 
say urandom(); # sample: 35174325641989353410</langsyntaxhighlight>
 
=={{header|Standard ML}}==
{{Works with|Unix}}
<syntaxhighlight lang="sml">fun sysRand32 () =
let
val strm = BinIO.openIn "/dev/urandom"
in
PackWord32Big.subVec (BinIO.inputN (strm, 4), 0) before BinIO.closeIn strm
end
 
val () = print (LargeWord.fmt StringCvt.DEC (sysRand32 ()) ^ "\n")</syntaxhighlight>
 
=={{header|Tcl}}==
<langsyntaxhighlight lang="tcl">package require Tcl 8.5
 
# Allow override of device name
Line 952 ⟶ 1,492:
close $f
return $x
}</langsyntaxhighlight>
Usage:
<langsyntaxhighlight lang="tcl">% puts [systemRandomInteger]
636131349</langsyntaxhighlight>
 
=={{header|UNIX Shell}}==
<langsyntaxhighlight UNIXlang="unix Shellshell">od -An -N 4 -t u4 /dev/urandom</langsyntaxhighlight>
 
=={{header|Wee Basic}}==
Due to how the code works, any key has to be entered to generate the random number.
<langsyntaxhighlight Weelang="wee Basicbasic">let keycode=0
let number=1
print 1 "Press any key to generate a random number from 1 to 10.
Line 974 ⟶ 1,514:
wend
print 1 number
end</langsyntaxhighlight>
 
=={{header|Wren}}==
<syntaxhighlight lang="wren">import "io" for File
 
File.open("/dev/urandom") { |file|
var b = file.readBytes(4).bytes.toList
var n = b[0] | b[1] << 8 | b[2] << 16 | b[3] << 24
System.print(n)
}</syntaxhighlight>
 
{{out}}
Sample run:
<pre>
2614048905
</pre>
 
=={{header|X86 Assembly}}==
Processors supporting the new RDRAND feature can generate a random 32-bit integer in two instructions:
<langsyntaxhighlight lang="x86">L: rdrand eax
jnc L</langsyntaxhighlight>
RDRAND reads the CPU's cryptographically-secure hardware random number generator. The loop is needed because RDRAND can occasionally fail to retrieve a value — it sets the carry flag to indicate whether it succeeded.
 
Line 989 ⟶ 1,544:
limited to 31 bits.
 
<langsyntaxhighlight XPL0lang="xpl0">code Ran=1;
int R;
R:= Ran($7FFF_FFFF)</langsyntaxhighlight>
 
=={{header|zkl}}==
{{trans|C}}
Linux:
<langsyntaxhighlight lang="zkl">const RANDOM_PATH="/dev/urandom";
fin,buf:=File(RANDOM_PATH,"r"), fin.read(4);
fin.close(); // GC would also close the file
println(buf.toBigEndian(0,4)); // 4 bytes @ offset 0</langsyntaxhighlight>
{{out}}
<pre>
1,150

edits