88#include < cassert>
99
1010#include " virtualmachine_p.h"
11- #include " internal/global .h"
11+ #include " internal/randomgenerator .h"
1212
1313#define MAX_REG_COUNT 1024
1414
@@ -29,6 +29,8 @@ using namespace vm;
2929
3030static const double pi = std::acos(-1 ); // TODO: Use std::numbers::pi in C++20
3131
32+ IRandomGenerator *VirtualMachinePrivate::rng = nullptr ;
33+
3234const unsigned int VirtualMachinePrivate::instruction_arg_count[] = {
3335 0 , // OP_START
3436 0 , // OP_HALT
@@ -106,6 +108,9 @@ VirtualMachinePrivate::VirtualMachinePrivate(VirtualMachine *vm, Target *target,
106108 regs[i] = new Value ();
107109 loops.reserve (256 );
108110 callTree.reserve (1024 );
111+
112+ if (!rng)
113+ rng = RandomGenerator::instance ().get ();
109114}
110115
111116VirtualMachinePrivate::~VirtualMachinePrivate ()
@@ -360,7 +365,7 @@ do_loop_end : {
360365 DISPATCH ();
361366
362367do_random:
363- REPLACE_RET_VALUE (randint< long > (READ_REG (0 , 2 )->toDouble (), READ_REG (1 , 2 )->toDouble ()), 2 );
368+ REPLACE_RET_VALUE (rng-> randint (READ_REG (0 , 2 )->toDouble (), READ_REG (1 , 2 )->toDouble ()), 2 );
364369 FREE_REGS (1 );
365370 DISPATCH ();
366371
@@ -539,7 +544,7 @@ do_list_del : {
539544 index = 0 ;
540545 } else if (str == " random" ) {
541546 size_t size = list->size ();
542- index = size == 0 ? 0 : randint< size_t > (1 , size);
547+ index = size == 0 ? 0 : rng-> randint (1 , size);
543548 } else
544549 index = 0 ;
545550 } else {
@@ -567,7 +572,7 @@ do_list_insert : {
567572 index = 0 ;
568573 } else if (str == " random" ) {
569574 size_t size = list->size ();
570- index = size == 0 ? 1 : randint< size_t > (1 , size);
575+ index = size == 0 ? 1 : rng-> randint (1 , size);
571576 } else
572577 index = 0 ;
573578 } else {
@@ -594,7 +599,7 @@ do_list_replace : {
594599 index = list->size ();
595600 else if (str == " random" ) {
596601 size_t size = list->size ();
597- index = size == 0 ? 0 : randint< size_t > (1 , size);
602+ index = size == 0 ? 0 : rng-> randint (1 , size);
598603 } else
599604 index = 0 ;
600605 } else {
@@ -617,7 +622,7 @@ do_list_get_item : {
617622 index = list->size ();
618623 else if (str == " random" ) {
619624 size_t size = list->size ();
620- index = size == 0 ? 0 : randint< size_t > (1 , size);
625+ index = size == 0 ? 0 : rng-> randint (1 , size);
621626 } else
622627 index = 0 ;
623628 } else {
0 commit comments