此功能的实现需要用到random---随机数的生成和使用
block.timestamp 时间戳
uint random = uint(keccak256(block.timestamp,msg.sender,counter)) % 8;
//意为 uint类型随机数 用哈希算法、时间戳、地址和计数器多种因素来进行生成 避免高重复率
// 后面的 %8 %x x即为要取的范围最大值 x 为 8 则取 1-8 的随机数
pragma solidity ^0.4.25;
contract CallName {
string[8] names = ["xx","cc","zz","44","55","66","77","88"];
uint counter = 0;
string name;
uint number;
//生成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) {
// uint index = getRandom();
require(number <= 7,"name is out");//点名八次后停止 数组索引是0-7 所以 number<=7
uint index = 0;
while(true){
index = getRandom();
if(keccak256(names[index]) != keccak256("")){
//这里字符串不能直接用!= 或== 比较 字符串是固定字节数组(数组) 对比两者的哈希值
break;
}
}
name = names[index];
number += 1;//点名计数
delete names[index];//去除点过的名字
return name;
}
}