我一直在寻找这个问题的一些答案,但是当我试图找到解决方案时似乎没有任何效果。
我想要实现的是在Javascript&中创建一个微调器。 Adobe Edge 随机旋转数字,不再重复该数字,直到所有数字都被旋转。
我知道这对于一个体面的程序员来说应该相当容易,但我还不是那么有经验。
这是我到目前为止所做的,但是它还没有完成,而且还有错误:
public class SomeTopClass
{
// ...
public class FileSizeFormatProvider : IFormatProvider, ICustomFormatter
{
// ...
}
// class is in SomeClass, therefore it is a nested class. You cannot define extension mathods here
public static class ExtensionMethods
{
public static string ToFileSize(this long l)
{
return String.Format(new FileSizeFormatProvider(), "{0:fs}", l);
}
}
}
希望有人可以帮助我。提前谢谢。
答案 0 :(得分:4)
有两种方法可以实现这一目标。
存储已旋转的值数组。然后,当您生成一个新数字时,检查它是否在旋转数字数组中。如果是,则生成一个新数字并再次检查,直到得到一个不在数组中的数字。否则,将其添加到数组中。
正如您所做的那样,预先生成所有有效数字的数组。然后,每次旋转数字时,将其从该数组中删除。这样,下次你“旋转”时,你只会选择尚未旋转的值。
预先生成所有有效数字的数组,然后随机排序。然后你所要做的就是继续拍摄数组中的第一项。
按顺序,选项3是最优雅的,但它的缺点是控制台打开的人可能会看到下一个确切的数字!选项2是次佳的,如果允许用户知道某个号码不能出现两次,他们就不能通过查看剩余的可用号码来“欺骗”。选项1的效率最低 - 因为这意味着您的代码需要做更多的工作才能尝试找到“免费”号码。
老实说,如果你的游戏需要完全不受黑客攻击,那么你不会想要生成任何随机数的客户端,所以如果这只是为了一点乐趣,那么哪个方法并不重要你用。如果你是为赌博网站写的,首先让我知道哪一个我可以发财,然后将你的逻辑移到服务器上。
所以这是选项2方法的一个例子
<!DOCTYPE html>
<html>
<head>
<script>
var numbers = []; // this array will store the available numbers..
function generateNumbers()
{
// populate the available numbers however you need to..
for(var i=0; i<360; i+=30)
{
numbers.push(i);
}
}
function spin()
{
if(numbers.length==0)
{
// then we've used up all available numbers..start new game or whatever you need to do..
alert("starting again");
generateNumbers();
}
var rand = Math.floor(Math.random()*numbers.length); // select an index randomly based on the number of remaining available numbers..
var num = numbers[rand];
numbers.splice(rand,1); // remove the number we selected so it can't be selected next time..
document.getElementById("number").innerHTML = num;
}
</script>
</head>
<body>
<button onclick="spin()">SPIN</button>
<div id="number"></div>
</body>
</html>
以下选项3.主要区别在于您只需移动()下一个值而不必随意选择。
<!DOCTYPE html>
<html>
<head>
<script>
var numbers = [];
function generateNumbers()
{
for(var i=0; i<360; i+=30)
{
numbers.push(i);
}
function sort(a,b)
{
return (Math.random()>0.5)? -1 : 1;
}
numbers.sort(sort);
}
function spin()
{
if(numbers.length==0)
{
alert("starting again");
generateNumbers();
}
var num = numbers.shift();
document.getElementById("available").innerHTML = "Available:" + numbers.join(",");
document.getElementById("number").innerHTML = "Selected:" + num;
}
</script>
</head>
<body>
<button onclick="spin()">SPIN</button>
<div id="available"></div>
<div id="number"></div>
</body>
</html>
希望这能让您了解如何将其融入代码中。
答案 1 :(得分:3)
看起来你已经有了一系列可能的值。在这种情况下,您可以简单地对阵列进行洗牌并完成它。 JavaScript没有内置的shuffle函数,但实现起来非常简单。
的示例mov
答案 2 :(得分:1)
您需要做的是,选择一个随机数并将其存储在数组中,但在存储之前,检查该数组中是否已存在>如果坚强>,那么选择另一个。 如果您选择的值数组包含所有可能的值,则重置数组。
以下是示例:https://jsfiddle.net/5a7mqsbn/1/
var alreadyArr = new Array();
$(function() {
$("#generate").click(function() {
var newFound = false;
do {
var num = (Math.floor(Math.random() * 12) + 1) * 30;
if (alreadyArr.length == 12) {
alreadyArr = [num];
newFound = true;
} else if (alreadyArr.indexOf(num) < 0) {
alreadyArr.push(num);
newFound = true;
}
} while (!newFound);
$("#numbers").text(alreadyArr);
});
});
&#13;
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js"></script>
<p id="numbers"></p>
<button id="generate">
Next Random number
</button>
&#13;
答案 3 :(得分:1)
var array = [];
setInterval(function(){
if(array .length === 0){
reload();
}
var result = getRandom();
console.log(result);
},1000);
function getRandom(){
var index = (array.length === 1 ? 0 : Math.floor(Math.random() * array.length));
return array.splice(index, 1)[0];
}
function reload(){
array = [2,3,4,5,6,7,8,9,0,1,44,66];
}
答案 4 :(得分:0)
此函数将使用Math.random()
随机选择数组中的数字,而不是在使用所有数字之前再次选择它:
var originalArray = ['360', '330', '300', '270', '240', '210',
'180', '150', '120', '90', '60', '30'];
var totalSpin = [];
function spinArray(){
var spin = Math.floor(Math.random()*originalArray.length);
if(totalSpin.indexOf(spin) == -1){
totalSpin.push(spin);
parag.innerHTML = originalArray[spin];
} else {
spinArray();
}
if(totalSpin.length == originalArray.length)
totalSpin = [];
}
答案 5 :(得分:0)
鉴于已经拥有数组值并且需要randomize
的位置,您可以采用另一种方法是使用Set生成unique random values
:
var data = ['360', '330', '300', '270', '240', '210','180', '150', '120', '90', '60', '30'];
let getUniqueRandomNumbers = n => {
let set = new Set()
while (set.size < n) set.add(Math.floor(Math.random() * n))
return Array.from(set)
}
let result = getUniqueRandomNumbers(data.length).map(x => data[x])
console.log(result)
这个想法是生成新数组的索引,然后使用它们通过Array.map
填充它。
您可以采用的另一种方法是通过Array.sort
和Math.random
:
var data = ['360', '330', '300', '270', '240', '210','180', '150', '120', '90', '60', '30'];
let result = data.sort(function(a, b){
return 0.5 - Math.random() // <— sort needs a number and this makes it work
});
console.log(result);