2017-05-07 34 views
0

我目前正在为自定义名称生成器创建随机单词部分。每个值都与1-2个人合并以创建自定义名称。问题是,我希望某些字词部分包含随机字母。随机返回数组的函数是设置固定的结果 - javascript

我目前有一个数组设置,每个随机字部分和一个链接到这个随机字母创建者的函数。问题是,当数组第一次运行时,它将这些字母设置为特定的事物。因此,它使输出相同(对于那些“自定义”字母)。

我的代码如下:

//Letters in alphabet in order to generate more random outputs. 
var alphabet = ["A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M", "N", "O", "P", "Q", "R", "S", "T", "U", "V", "W", "X", "Y", "Z"]; 

//Selects a random letter and outputs a return value. 
var randomLetter = function(letterCase) { 

    var letterID = randomNumber(alphabet.length); 
    console.log(letterID); 

    if(letterCase === "C") { 
     return alphabet[letterID]; 

    } else if(letterCase === "L") { 
     return alphabet[letterID].toLowerCase(); 

    } else { 
     console.log("randomLetter function failed to generate a random letter. No set letter case."); 
    } 
}; 

//Base names for town name generations. Called within a function. 
var townNameStart = ["Ji", "Ri", "Li", "We", "Wete", "Lakeside Zi", "Za", "Mount "+randomLetter("C")+randomLetter("L")]; 

如果我跑console.log(townNameStart[7] +" "+ townNameStart[7]);我希望它输出两个完全不同的字母组合。我不希望它在输出时像这样结束:i.imgur.com/YruxwPq.png。它需要每次有完全不同的字母(没有重新加载脚本)。如何调用数组中的函数(分配随机字母)以防止相同的字母输出?

我应该每次调用函数时都将数组自己设置为其原始状态?哪种解决方法最好(重新定义数组,或其他)?

仍在寻求帮助。

+0

为什么你有一个功能做两件事?有一个函数生成一个随机数(并测试它的工作原理)并将一个调用传递给一个函数,该函数在该索引处返回字母表的字母(并测试字母函数的作用)'getLetter(genRandom(26) );'或者其他。你也不需要两个数组,'String.prototype.toUpperCase'存在。 –

+0

你不知道为什么你的代码不工作,你问我如何将任务分解成单独的,最小的,可单独测试的部分将帮助? –

+0

@JaredSmith我在使用.toUpperCase时出现错误,我再次仔细检查一下,以确认它不在我身上。做一些改变。我的问题是否清楚,还是需要澄清? – bdkopen

回答

0

在控制台中出现了一些错误。在发布之前务必检查它,并且如果发布错误信息。

//Letters in alphabet in order to generate more random outputs. 
var alphabet = ["A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M", "N", "O", "P", "Q", "R", "S", "T", "U", "V", "W", "X", "Y", "Z"]; 

function randomNumber(len) { 
    return Math.round(Math.random() * len) 
} 
//Selects a random letter and outputs a return value. 
var randomLetter = function(lower) { 
    var letterID = randomNumber(alphabet.length); 
    if (lower) { 
    return alphabet[letterID].toLowerCase(); 
    } 
    return alphabet[letterID]; 
}; 

//Base names for town name generations. 
var townNameStart = [ 
    "Ji", 
    "Ri", 
    "Li", 
    "We", 
    "Wete", 
    "Lakeside Zi", 
    "Za", 
    "Mount " + randomLetter() + randomLetter(true), 
    "Saint " + randomLetter() + randomLetter(true) 
]; 

console.log(townNameStart.join(', ')) 

输出Ji, Ri, Li, We, Wete, Lakeside Zi, Za, Mount Ua, Saint Bn

你能在

澄清是什么让每次数组称为随机字母不同的最有效方法是什么?

一个选项是洗牌数组,但随机性本身就是一个挑战。

// From http://stackoverflow.com/questions/6274339/how-can-i-shuffle-an-array 
function shuffle(a) { 
    for (let i = a.length; i; i--) { 
    let j = Math.floor(Math.random() * i); 
    [a[i - 1], a[j]] = [a[j], a[i - 1]]; 
    } 
} 

//Selects a random letter and outputs a return value. 
var randomLetter = function(lower) { 
    var letterID = randomNumber(alphabet.length); 
    if (lower) { 
    return alphabet[letterID].toLowerCase(); 
    } 
    shuffle(alphabet); 
    return alphabet[letterID]; 
}; 

编辑处理意见:

的代码复制粘贴直接Plnkr错误:

(index):51 Uncaught ReferenceError: randomNumber is not defined 
    at randomLetter ((index):51) 
    at window.onload ((index):66) 
randomLetter @ (index):51 
window.onload @ (index):66 

此外,你能解释一下如何&对象为何保留功能与阵列?

这个问题还不清楚。

+0

错过了,并测试了你的脚本,它的迟到。如果我尝试在数组中调用[7]两次,它将输出相同的值。我希望每个电话都输出一个不同的单词。因此,使每个输出不同而不是相同。如果我运行了'console.log(townNameStart [7] +“”+ townNameStart [7]);'用你的代码输出这个http://i.imgur.com/YruxwPq.png而不是两个单词不同的随机字符。更新主要帖子希望澄清。道歉。 – bdkopen

+0

不用担心!我稍后再看看。 – Phix

+0

您正在访问数组'townNameStart'的第7个索引。当然它会是一样的。 – Phix