![]() |
![]() |
|
前置き |
Scilab用xorshift |
/* Scilabe 32bit xorshift function */ /* (c) 2025 cepstrum.co.jp */ clear; DATLEN =80000; HEXSEED='A5A50F0F'; //--------------------------------- // 32bit xorshift // p^=(p<<5); p^=(p>>13); p^=(p<<6); // useage : [y, seed]=xorshift32bit(seed) // seed is (1:32) array of -1/1 instaed of 0/1 value function [y, seed]=xorshift32bit(x) x=-x.*[x(6:32), -ones(1:5)] x=-x.*[-ones(1:13), x(1:19)] x=-x.*[x(7:32), -ones(1:6)] seed=x y=sum(2^(31:-1:0).*((x+1)/2)); // convert (1:32) array of -1/1 value to unsigned integer endfunction //--------------------------------- // covert hex string to (1:32) array of -1/1 value function y=hex2seed(x) x=hex2dec(x); x=dec2bin(x); x=ascii(x); x=2*(x-48)-1; // 48 (0x30) is ASCII code of '0' y=x endfunction //--------------------------------- seed=hex2seed(HEXSEED); // generate xorshift seed mprintf("seed(uint) %u\n", hex2dec(HEXSEED)); mprintf("seed(-1/1) "); for i=1:32 mprintf("%2i ", seed(i)); end mprintf("\n"); y=zeros(1:DATLEN); for i=1:DATLEN [y(i), seed]=xorshift32bit(seed); // seed holds internal state end for i=0:7 mprintf('%12u %12u %12u %12u\n', y(i*4+1:i*4+4)); end savewave('out.wav', y/max(abs(y))-0.5, 8000);
実行結果seed(uint) 2779057935 seed(-1/1) 1 -1 1 -1 -1 1 -1 1 1 -1 1 -1 -1 1 -1 1 -1 -1 -1 -1 1 1 1 1 -1 -1 -1 -1 1 1 1 1 1344132296 3134319730 3660722449 2152518865 4250013827 2478612643 4023055366 3013925157 155769594 888360614 225206834 2578317235 2848799107 2345412211 1636953940 3087578548 4293475012 2975037943 1428104117 1237602575 573791644 1923676699 3390551366 2981361934 1978748072 1014979822 1472610184 1848186630 1755662809 2146120730 551644919 261671666
C用xorshift |
/* 32bit xorshift function */ /* (c) 2025 cepstrum.co.jp */ #include <stdio.h> #include <stdlib.h> #include <math.h> #include <stdint.h> #define SEED 0xA5A50F0F #define DATLEN 80000 #define OUT_FNAME "out.txt" // output data file name //================================================================ // xorshift random number generator (32bit) uint32_t xorshift32bit(uint32_t seed) { static uint32_t y=0x0f0f0f0f; // default seed value if (seed!=0) { y=seed; // set new seed return seed; } y=y^(y<<5); y=y^(y>>13); y=y^(y<<6); return y; } //================================================================ unsigned rnd[DATLEN]; int main() { FILE *fp; unsigned i, k; xorshift32bit(SEED); // set seed printf("seed %u\n", SEED); for (i=0; i<DATLEN; i=i+1) rnd[i]=xorshift32bit(0); for (i=0; i<8; i=i+1) { for (k=0; k<4; k=k+1) { printf("%12u ", rnd[i*4+k]); } printf("\n"); } // output xorshift random noise fp=fopen(OUT_FNAME, "w"); for (i=0; i<DATLEN; i=i+1) fprintf(fp, "%u\n", rnd[i]); fclose(fp); }
実行結果
seed 2779057935 1344132296 3134319730 3660722449 2152518865 4250013827 2478612643 4023055366 3013925157 155769594 888360614 225206834 2578317235 2848799107 2345412211 1636953940 3087578548 4293475012 2975037943 1428104117 1237602575 573791644 1923676699 3390551366 2981361934 1978748072 1014979822 1472610184 1848186630 1755662809 2146120730 551644919 261671666
|
|
|