Is the number biased? Yes. I have a nice idea.
Required Broadwell, Skylake, KabyLake, CoffeeLake ...
Code: Select all
; from wikipedia
; The RDSEED instruction was added to Intel Secure Key
; For seeding another pseudorandom number generator, available in Broadwell CPUs.
Global RDSEED.i
!XOR Rax, Rax
!XOR Rdx, Rdx
!XOR Rbx, Rbx
!XOR Rcx, Rcx
!INC Eax
!INC Eax
!INC Eax
!INC Eax
!INC Eax
!INC Eax
!INC Eax ;7
!CPUID
!XOR Rax, Rax
!XOR Rdx, Rdx
!XOR Rcx, Rcx
!INC Rdx
!INC Rcx
!SHL Rdx, cl
!SHL Rdx, cl
!SHL Rdx, cl
!SHL Rdx, cl
!SHL Rdx, cl ; 5
!SHL Rdx, cl
!SHL Rdx, cl
!SHL Rdx, cl
!SHL Rdx, cl
!SHL Rdx, cl ; 10
!SHL Rdx, cl
!SHL Rdx, cl
!SHL Rdx, cl
!SHL Rdx, cl
!SHL Rdx, cl ; 15
!SHL Rdx, cl ; 16
!SHL Rdx, cl ; 17
!SHL Rdx, cl ; 18
!AND Ebx, Edx
!CMP Ebx, Edx
!JNE not_support_RDSEED
!INC Rax
!not_support_RDSEED:
!MOV [v_RDSEED], Rax
;
!XOR Rax, Rax
!XOR Rdx, Rdx
!XOR Rbx, Rbx
!XOR Rcx, Rcx
If Not RDSEED
MessageRequester("ERROR", "This CPU can't support RDSEED.", #PB_MessageRequester_Ok|#PB_MessageRequester_Error)
End
EndIf
Procedure Test()
Protected Random_seed.i
!XOR Rax, Rax
!MOVNTI [p.v_Random_seed], Rax
!RDSEED Rax
!MOVNTI [p.v_Random_seed], Rax
RandomSeed(Random_seed)
EndProcedure
Test()
; OR
Global Random_seed.i
!XOR Rax, Rax
!MOVNTI [v_Random_seed], Rax
!RDSEED Rax
!MOVNTI [v_Random_seed], Rax
RandomSeed(Random_seed)