Scilab/MATLAB用xorshift関数(擬似乱数生成関数)

| ← back |
| home |

前置き

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 

| ← back | ↑top |

| home |