Best method to do randomization from Virtual sequence

I have 2 sequences which are sending transactions of type trans. What is the preferred method to randomize them to have same field value or some constrained value from virtual sequence? I want to have some constraint inside virtual sequence as field value is based on some data structure that maintain in virtual sequencer.

  1. Use `uvm_do_with macro in virtual sequence.
  2. Use execute_item(obj) method of sequencer from virtual sequence.
  3. Randomize sequence from Vsequence and then start on sequencers.
class trans extends uvm_sequence_item;
rand bit[2:0] addr;
rand bit[2:0] data;
//factory registration and constructor code.
endclass

//Method 1:
class vsequence extends uvm_sequence;
sequenceA sqA;
sequenceB sqB;

//Method 1:
task body();
repeat(5)begin
`uvm_do_with(sqA,{sqA.tr.addr==10});
`uvm_do_with(sqB,{sqrB.tr.addr==5}); //Harcoded constraint just for example.
end
endtask

//METHOD::2 
task body();
//Create sqA
// Create SqB;
repeat(5)begin
sqA.randomize() with {t1.addr == 5}; // just for exampl. Randomization value is based on some Data structure maintained inside vsequencer
sqB.randomize() with {t2.addr == 10}; // just for example. Randomization value is based on some Data structure maintained inside vsequencer
sqA.start(vsqr.sqrA);
sqA.start(vsqr.sqrA);
end
endtask

//Method::3
task body();
trans t = trans::type_id::create("t");
t.randomize() with {t.addr ==10;};
p_sequencer.seqrA.execute_item(t);
p_sequencer.seqrB.execute_item(t);
endtask

endclass