在javascript中定义随机化比率

在javascript中定义随机化比率,javascript,jquery,random,Javascript,Jquery,Random,在我下面的代码中,数组中的一个对象是随机抽取的。然而,我想要的是,始终存在一个确定的对象获取方式比率 这里的比率是1个动物,1个字母,4个整数,我每隔24次运行随机选择,希望比率保持不变:4个动物,4个字母,16个整数。现在,它不会这样做,可能只是近似于无限次“运行”的真实比率 var teststim = [ {stim: "CAT", type: "ANIMAL"}, {stim: "A", type: "LETTER"}, {s

在我下面的代码中,数组中的一个对象是随机抽取的。然而,我想要的是,始终存在一个确定的对象获取方式比率

这里的比率是1个动物,1个字母,4个整数,我每隔24次运行随机选择,希望比率保持不变:4个动物,4个字母,16个整数。现在,它不会这样做,可能只是近似于无限次“运行”的真实比率

var teststim =  [
        {stim: "CAT",   type: "ANIMAL"},
        {stim: "A",     type: "LETTER"},
        {stim: "3",     type: "INTEGER"},
        {stim: "7",     type: "INTEGER"},
        {stim: "5", type: "INTEGER"},
                {stim: "9", type: "INTEGER"}]
newthing = teststim[Math.floor((Math.random() * teststim.length))];

我该怎么做呢?有没有办法定义这种半随机随机随机的确切比率?

将你的比率视为一个单独的动作。每次你从列表中取一些东西时,实际上是取1个动物、1个字母和4个整数(每个都是随机的)

如果您将该比率视为单个操作,那么剩下的就是多次调用该单个操作:

我不知道您总共携带的物品数量是否应该是随机的,因此我假设您总共需要24件物品:

for(var i = 0; i < 4; i++) //4 iterations * 6 random items per action = 24 total
{
    TakeRandomRatioFromList(sourceList, targetList);
}

....

function TakeRandomRatioFromList(sourceList, targetList)
{
    //Take 1 random ANIMAL for sourceList, add it to targetList

    //Take 1 random LETTER for sourceList, add it to targetList

    //Take 4 random INTEGERS for sourceList, add it to targetList    
}    
for(var i=0;i<4;i++)//4次迭代*每个动作6个随机项=总共24个
{
TakeRandomRatioFromList(源列表、目标列表);
}
....
函数TakeRandomRatioFromList(源列表、目标列表)
{
//取1只随机动物作为源列表,将其添加到targetList
//取1个随机字母作为sourceList,将其添加到targetList
//取sourceList的4个随机整数,将其添加到targetList
}    

通过这种方式,您可以确保每个动物和字母的数字记录将始终运行4次。您所要做的就是确保使用该函数只能从sourceList中获取项目。

如果您希望以随机顺序获得一组已定义的项目,通常您会使用随机移动。在您的情况下,您还需要为每种类型选择随机项,不过:

var items = [
   [ {stim: "CAT", type: "ANIMAL"}],
   [ {stim: "A", type: "LETTER"}],
   [ {stim: "3", type: "INTEGER"},
     {stim: "7", type: "INTEGER"},
     {stim: "5", type: "INTEGER"},
     {stim: "9", type: "INTEGER"}],
];
var times = 4;

var result = [];
for (var i=0; i<times; i++)
    for (var j=0; j<items.length; j++) {
        var choose = items[i],
            cholen = choose.length;
        for (var k=0; k<cholen; i++)
            result.push(choose[Math.floor(Math.random()*cholen)]);
    }
// now we have 4 "random" cats, 4 "random" letters, and 16 random integers

result.shuffle();
var项目=[
[{stim:“CAT”,type:“ANIMAL”}],
[{stim:“A”,键入:“字母”}],
[{stim:“3”,键入:“INTEGER”},
{stim:“7”,键入:“INTEGER”},
{stim:“5”,键入:“INTEGER”},
{stim:“9”,键入:“INTEGER”}],
];
var时间=4;
var结果=[];

对于(var i=0;您一次执行的比率也只有大约1/6:1/6:2/3。@Bergi:我认为执行就是OP现在获取数据的一个例子。如果他想要24个项目,他大概会调用24次。(OP可以确认吗?)从16个整数中,你想要4次
3
、4次
5
等等,还是只想要16个随机整数?@Bergi只要16个随机整数就可以了。我会试试看,谢谢。我的源列表是一个对象数组,其中我根据“type”属性随机获取动物、字母和整数,并进一步使用它们从我的targetList?还是我错了?sourcelist是您在代码片段中提到的原始列表。target list是拾取的项目列表。我不太了解Jsson以及如何定义随机选择,但一个有效(但未优化)的解决方案是
do{pickedItem=sourcelist[Math.floor((Math.random()*teststim.length));}while(pickedItem.Type!==“ANIMAL”)
。一旦通过while循环,只需将该项添加到目标列表中。不过,可能还有更好的方法。