在 JavaScript 中创建具有单个预定义选项的随机数组
Creating A Randomised Array with a Single Pre-defined Choice in JavaScript
我正在创建一个程序,该程序将提出问题并提供5个答案选择。
一个是预定义的并且是正确的,其他的我想从答案库中随机选择,整个数组也要洗牌。
我写了一些东西,但它有一些不一致的地方。
首先,有时预定义的选项在列表中出现两次(它似乎跳过了我的if
检查)。另一个是有时,当我运行它时编辑器会崩溃。
我使用for in
循环,我担心崩溃是由永无止境的循环引起的。
这是我的代码:
private var numberOfComponents:int;
private var maxComponents:int = 5;
//numberOfComponents returns the length property of my 'components' answer bank
componentsSelection = buildComponentSelectionList(0); //0 is the index of my correct answer
function buildComponentSelectionList(correctItemIndex){
var theArray:Array = new Array();
var indicesOfSelection:Array = getIndicesByIncluding(correctItemIndex);
Debug.Log(indicesOfSelection);
for (var i=0;i<indicesOfSelection.length;i++)
theArray.Push(components[indicesOfSelection[i]]);
return theArray;
}
function getIndicesByIncluding(correctItem){
var indicesArray:Array = new Array();
var numberOfChoices = maxComponents-1;
for(var i=0;i<numberOfChoices;i++){
var number = Mathf.Round(Random.value*(numberOfComponents-1));
addToRandomNumberSelection(indicesArray, number,correctItem);
}
indicesArray.Push(correctItem);
RandomizeArray(indicesArray);
return indicesArray;
}
function addToRandomNumberSelection(indicesArray:Array,number,correctItem){
if(indicesArray.length == 0){
indicesArray.Push(number);
} else {
var doesntExist = true;
for(var i=0;i<indicesArray.length;i++){
if(indicesArray[i] == correctItem)
doesntExist = false;
if (indicesArray[i] == number)
doesntExist = false;
}
if(doesntExist) {
indicesArray.Push(number);
} else {
addToRandomNumberSelection(indicesArray, Mathf.Round(Random.value*(numberOfComponents-1)),correctItem);
}
}
}
function RandomizeArray(arr : Array)
{
for (var i = arr.length - 1; i > 0; i--) {
var r = Random.Range(0,i);
var tmp = arr[i];
arr[i] = arr[r];
arr[r] = tmp;
}
}
编辑器是Unity3D,代码是JavaScript的一个版本;我认为我的错误是逻辑错误,而不是语法错误。
我觉得我已经盯着这段代码太久了,我错过了一些明显的东西。
有人可以帮助我吗?
您可以循环浏览选项并确定应包含的概率,然后随机播放包含的选项:
function getRandomOptions(allOptions, correctIndex, count){
var result = [allOptions[correctIndex]];
count--;
var left = allOptions.length;
for (var i = 0; count > 0; i++) {
if (i != correctIndex && Math.floor(Math.random() * left) < count) {
result.push(allOptions[i]);
count--;
}
left--;
}
shuffleArray(result);
return result;
}
function shuffleArray(arr) {
for (var i = arr.length - 1; i > 0; i--) {
var r = Math.floor(Math.random() * i);
var tmp = arr[i];
arr[i] = arr[r];
arr[r] = tmp;
}
}
演示:http://jsfiddle.net/Guffa/wXsjz/
相关文章:
- 如何在选项卡上定义属性'的主窗口对象
- 为什么grunt contrib connect的中间件选项的第三个参数是未定义的
- 绑定时将Parsley minlength消息作为选项传递时,未对其进行自定义
- TinyMCE保留预定义的html结构
- 使用定义的选项值定义grunt别名
- 如何设置方法,该方法只能删除元素的预定义值
- 未指定预定义 el 而不呈现的主干视图
- 如何将返回响应的预定义 JavaScript 回调作为参数传递到函数中
- Angular.js可过滤列表,通过选择字段和可点击地图预定义值
- 将预定义的HTML连接到主干中的模型和视图
- ui-sortable不工作(对于预定义的DOM位置)
- 由于异步函数延迟执行和完成,变量返回预定义值
- 添加“then"方法在预定义的“finally”之前放入$promise链中.方法
- jQuery UI滑块-有预定义的'
- Moment() vs预定义的Moment()日期
- Safari扩展-改变预定义的Javascript变量值
- Chrome扩展注入代码到一些预定义的url
- 通过HTML从预定义的emailID发送电子邮件
- 使用jquery验证插件显示预定义的HTML元素
- callbackId referenceError:选项没有定义