Skip to content

Instantly share code, notes, and snippets.

@kewang
Last active December 19, 2015 05:21
Show Gist options
  • Save kewang/6ac7df40106aca684191 to your computer and use it in GitHub Desktop.
Save kewang/6ac7df40106aca684191 to your computer and use it in GitHub Desktop.
Math.random() at V8 engine from https://blog.gslin.org/archives/2015/12/18/6202/
// MWC1616 (multiply with carry, combining two 16-bit parts)
#include <stdio.h>
#include <inttypes.h>
uint32_t state0 = 1;
uint32_t state1 = 2;
uint32_t mwc1616();
int main(){
int input = 0;
printf("input: ");
scanf("%d", &input);
for(int i = 0; i < input; i++){
printf("number %d: %" PRIu32 "\n", i + 1, mwc1616());
}
return 0;
}
uint32_t mwc1616() {
state0 = 18030 * (state0 & 0xffff) + (state0 >> 16);
state1 = 30903 * (state1 & 0xffff) + (state1 >> 16);
return state0 << 16 + (state1 & 0xffff);
}
// xorshift128+ (It uses 128 bits of internal state, has a period length of 2128 - 1)
#include <stdio.h>
#include <inttypes.h>
uint64_t state0 = 1;
uint64_t state1 = 2;
uint64_t xorshift128plus();
int main(){
int input = 0;
printf("input: ");
scanf("%d", &input);
for(int i = 0; i < input; i++){
printf("number %d: %" PRIu64 "\n", i + 1, xorshift128plus());
}
return 0;
}
uint64_t xorshift128plus() {
uint64_t s1 = state0;
uint64_t s0 = state1;
state0 = s0;
s1 ^= s1 << 23;
s1 ^= s1 >> 17;
s1 ^= s0;
s1 ^= s0 >> 26;
state1 = s1;
return state0 + state1;
}
@kewang
Copy link
Author

kewang commented Dec 18, 2015

rand1 result

  1. 明顯亂度真的不足,100 個數字裡面有 10 個碰撞。
  2. 1000 個數字裡面有 185 個碰撞,好恐怖 XD
number 1: 2147483648
number 2: 1561329664
number 3: 2785017856
number 4: 2751463424
number 5: 1132323059
number 6: 2027387328
number 7: 2640056912
number 8: 3565999852
number 9: 1073741824
number 10: 528482304
number 11: 4175176064
number 12: 2509018584
number 13: 395854528
number 14: 3514826752
number 15: 0
number 16: 4026531840
number 17: 520093696
number 18: 1376076544
number 19: 939524096
number 20: 628047872
number 21: 3333726208
number 22: 2962077440
number 23: 2025736784
number 24: 842579968
number 25: 0
number 26: 2813391872
number 27: 903818750
number 28: 3221225472
number 29: 2944925696
number 30: 2207015616
number 31: 3023026432
number 32: 1496457216
number 33: 3489660928
number 34: 202149888
number 35: 1979711488
number 36: 2758672384
number 37: 772800512
number 38: 0
number 39: 1617174528
number 40: 1077706752
number 41: 2684354560
number 42: 0
number 43: 3758096384
number 44: 0
number 45: 2662467912
number 46: 780140544
number 47: 678081418
number 48: 918552576
number 49: 855638016
number 50: 2429812736
number 51: 2673940048
number 52: 321160560
number 53: 679477248
number 54: 1542848512
number 55: 516947968
number 56: 670826496
number 57: 1626472448
number 58: 2962597888
number 59: 0
number 60: 2684354560
number 61: 2560383744
number 62: 3640655872
number 63: 3432513536
number 64: 1873292288
number 65: 1879048192
number 66: 2589982720
number 67: 1577058304
number 68: 0
number 69: 2439380992
number 70: 2611051264
number 71: 61603840
number 72: 3788189696
number 73: 2679111680
number 74: 3717911552
number 75: 0
number 76: 2445471488
number 77: 805306368
number 78: 537862358
number 79: 1073741824
number 80: 3546042880
number 81: 2551971840
number 82: 702137264
number 83: 1042427836
number 84: 440685012
number 85: 3607101440
number 86: 3959455744
number 87: 113663024
number 88: 4288551680
number 89: 805306368
number 90: 1023410176
number 91: 201326592
number 92: 2248146944
number 93: 2592387072
number 94: 100663296
number 95: 1610612736
number 96: 1775632256
number 97: 671088640
number 98: 3690987520
number 99: 2900743488
number 100: 3446236976

rand2 result

無論是 100 或 1000 均無碰撞。

number 1: 8388677
number 2: 33554692
number 3: 70368777736387
number 4: 211106267148357
number 5: 281509366091972
number 6: 360777324180299
number 7: 288538377073858266
number 8: 865509272901433454
number 9: 1155350481850751274
number 10: 1191592583033944276
number 11: 10496030469740439798
number 12: 1362371001014398178
number 13: 10234834343287503199
number 14: 2065174045786219692
number 15: 4360127029907502923
number 16: 3280463725544326876
number 17: 4098392981707075411
number 18: 3999493022945510211
number 19: 1490933961015620186
number 20: 13252044636817621309
number 21: 15998111192842087806
number 22: 3805184684654049962
number 23: 2739691196446076535
number 24: 15675371886373393618
number 25: 16373398947986388217
number 26: 12742849885299357362
number 27: 11641641535542849349
number 28: 3689378200005102965
number 29: 3145800469842371638
number 30: 17219030420445954382
number 31: 3668431690361020590
number 32: 13546943171484547065
number 33: 16808136981184875603
number 34: 13845861160845235582
number 35: 8852200862211247723
number 36: 699026518363115144
number 37: 8293925671954159637
number 38: 15274184937527113523
number 39: 1048743372076943098
number 40: 6589685730235039986
number 41: 10525479616856879138
number 42: 1564029979705834839
number 43: 8836309103300525491
number 44: 17185595430701924191
number 45: 7774462923658878336
number 46: 9156714202621267408
number 47: 9073855556330494665
number 48: 9809055728216517630
number 49: 5974602311315261213
number 50: 16653475235850777094
number 51: 18378896225146838522
number 52: 6275638653143495417
number 53: 13179811534809561428
number 54: 4918526038294342068
number 55: 7966733538870889577
number 56: 6458857147292277487
number 57: 16571403441795631562
number 58: 11161965194589840534
number 59: 16551426864550469696
number 60: 2910623975771987637
number 61: 977383429329077839
number 62: 17290131397721251611
number 63: 6614358823849941483
number 64: 4679089892663293860
number 65: 13545859679776119440
number 66: 3986577872870462569
number 67: 10178517936490546005
number 68: 11528484683359700098
number 69: 103731509690654581
number 70: 9222253977375110814
number 71: 15960155939565520805
number 72: 15042777996554503780
number 73: 10457801986984164609
number 74: 3531540353971782134
number 75: 6914811899468296006
number 76: 14990687283285872618
number 77: 16985587451983864353
number 78: 8052459269610027055
number 79: 13646722749129909489
number 80: 14665231117979165609
number 81: 17391734286586560648
number 82: 2687224850187301973
number 83: 889758042480863963
number 84: 5029576666767552335
number 85: 1013612552819315568
number 86: 18056342327725070236
number 87: 5480952874543495157
number 88: 1891849764732654058
number 89: 18221417158714595206
number 90: 3272294331421227462
number 91: 12003761323053740818
number 92: 1001953065355272626
number 93: 14827013130330833070
number 94: 4633577708359906583
number 95: 9356947556742624210
number 96: 1267770674998689064
number 97: 6110005383056393794
number 98: 4779700150404563368
number 99: 12142154292939028740
number 100: 6696201114052734571

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment