pragma solidity ^0.4.25;
contract CallName {
//点名器 点过的不点
string[8] names = ["xx","cc","zz","44","55","66","77","88"];
uint counter = 0;
uint[] indexs; //保存被点名的下标索引
//生成1-8的随机数
function getRandom() public returns(uint) {
uint random = uint(keccak256(block.timestamp,msg.sender,counter)) % 8;
counter++;
return random;
}
//随机点名
function randomCallName() public returns(string) {
//判断是否全部都被点过名 如果点过则退出
require(names.length > indexs.length,"name is nothing!");
// uint index = getRandom();
//下标判断
while(true){
uint index = getRandom();
bool isExist = false;//判断点名随机数是否在点名列表中存在
for(uint i = 0;i < indexs.length;i++){
if(index == indexs[i]){ //如果没点过 不相同 则会执行下一个函数 isExist保持为false
isExist = true;
break;//如果点到 点过的会跳出循环 从while再次开始循环 直到点到没有点过的
//到了没有点过的 往下执行if exist会等于初始值flase 最后给indexs保存下标
//最后返回点的名字
}
}
//判断没被点名
if(isExist == false) {
indexs.push(index);//将点名的名字下标 添加到已点名列表中
return names[index];
}
}
return names[index];
}
}
之前点名器的新版本能够做到不重复点名