using System.Collections.Generic;
private IEnumerator<uint> r;
public static readonly Dictionary<string,uint> defaults=new Dictionary<string,uint>(){
public readonly Dictionary<string,uint> seeds;
public XorShift(uint? _w=null,uint? _x=null,uint? _y=null,uint? _z=null){
uint w=_w ?? (uint)Environment.TickCount;
uint y=_y ?? (w>>9)^(x<<6);
seeds=new Dictionary<string,uint>(){
{"x",x},{"y",y},{"z",z},{"w",w}
public IEnumerator<uint> randGen(uint w,uint x,uint y,uint z){
yield return w=(w^(w>>19))^(t^(t>>8));
public int randInt(int min=0,int max=0x7FFFFFFF){
return (int)(rand()%(max-min+1))+min;
public float randFloat(float min=0,float max=1){
return (float)(rand()%0xFFFF)/0xFFFF*(max-min)+min;
public T[] shuffle<T>(T[] _arr){
var arr=(T[])_arr.Clone();
for(int i=0;i<=arr.Length-2;i++){
int r=randInt(i,arr.Length-1);
public List<T> shuffle<T>(List<T> _arr){
var arr=new List<T>(_arr);
for(int i=0;i<=arr.Count-2;i++){
int r=randInt(i,arr.Count-1);
public class defaultSeed:XorShift{
public defaultSeed():base(
public static void Main(){
var r_def=new XorShift.defaultSeed();
var r_const=new XorShift(100);
Console.WriteLine(">> defaults");
foreach(var i in XorShift.defaults.Keys){
Console.WriteLine("{0}:{1}",i,XorShift.defaults[i]);
Console.WriteLine(">> seeds in r");
foreach(var i in r.seeds.Keys){
Console.WriteLine("{0}:{1}",i,XorShift.defaults[i]);
Console.WriteLine(">> rand 0 to UInt32Max");
Console.WriteLine(r_def.rand());
Console.WriteLine(">> randInt 0 to 100");
Console.WriteLine(r_const.randInt(0,100));
Console.WriteLine(">> randFloat 0 to 1");
Console.WriteLine(r.randFloat());
Console.WriteLine(">> shuffle Array");
int[] a=Enumerable.Range(0,20).ToArray();
Console.WriteLine(String.Join(", ",r.shuffle(a)));
Console.WriteLine(String.Join(", ",a));
Console.WriteLine(">> shuffle List<T>");
var b=new List<int>(Enumerable.Range(0,20));
Console.WriteLine(String.Join(", ",r.shuffle(b)));
Console.WriteLine(String.Join(", ",b));
Console.WriteLine(">> randCount in r");
Console.WriteLine(r.randCount);