function random() internal returns (uint) {
uint random = uint(keccak256(now, msg.sender, nonce)) % 1000;
nonce++;
return random;
}
Auf diese Weise können Sie Zufallszahlen generieren, aber es werden weniger als 100 sein, wie Sie es lösen können, danke
Was Sie wollen, ist eine Zufallszahl innerhalb eines Bereichs von 900 Optionen.
Also mach das:
function random() internal returns (uint) {
uint randomnumber = uint(keccak256(abi.encodePacked(now, msg.sender, nonce))) % 900;
randomnumber = randomnumber + 100;
nonce++;
return randomnumber;
}
Grundsätzlich erhalten Sie eine Zahl von 0 bis 899 und fügen dann 100 hinzu, um Ihrem Offset zu entsprechen.
Da Sie den Blockhash als Startwert für Zufallszahlen verwenden, handelt es sich tatsächlich um eine pseudozufällige Implementierung. Weitere Informationen finden Sie in diesem Beitrag . Um dies korrekt zu tun, benötigen Sie ein dezentralisiertes Orakel mit nachweislich zufälliger Überprüfung. Ein Chainlink VRF ist Ihre Antwort.
Hier ist eine Kovan-Implementierung Ihrer Anfrage, Sie können sie mit diesem Link zum Remixen bereitstellen . Sie können sich die Chainlink-Dokumente ansehen, um eine beispielhafte exemplarische Vorgehensweise auszuführen , um zu erfahren, wie Sie Chainlink-Anfragen stellen.
pragma solidity 0.6.6;
import "@chainlink/contracts/src/v0.6/VRFConsumerBase.sol";
contract RandomNumberConsumer is VRFConsumerBase {
bytes32 internal keyHash;
uint256 internal fee;
uint256 public randomResult;
/**
* Constructor inherits VRFConsumerBase
*
* Network: Kovan
* Chainlink VRF Coordinator address: 0xdD3782915140c8f3b190B5D67eAc6dc5760C46E9
* LINK token address: 0xa36085F69e2889c224210F603D836748e7dC0088
* Key Hash: 0x6c3699283bda56ad74f6b855546325b68d482e983852a7a82979cc4807b641f4
*/
constructor()
VRFConsumerBase(
0xdD3782915140c8f3b190B5D67eAc6dc5760C46E9, // VRF Coordinator
0xa36085F69e2889c224210F603D836748e7dC0088 // LINK Token
) public
{
keyHash = 0x6c3699283bda56ad74f6b855546325b68d482e983852a7a82979cc4807b641f4;
fee = 0.1 * 10 ** 18; // 0.1 LINK
}
/**
* Requests randomness from a user-provided seed
*/
function getRandomNumber() public returns (bytes32 requestId) {
require(LINK.balanceOf(address(this)) >= fee, "Not enough LINK - fill contract with faucet");
return requestRandomness(keyHash, fee);
}
/**
* Callback function used by VRF Coordinator
*/
function fulfillRandomness(bytes32 requestId, uint256 randomness) internal override {
randomResult = randomness;
}
}
Zwischen min und max:
randomness % (max - min + 1) + min
Zwischen 1 und max:
randomness % max + 1
Wo Zufälligkeit nicht von Chainlink VRF oder einer anderen Quelle bezogen wird
Ich habe die Methode von @Shawn Tabrizi verwendet
function random(uint maxNumber,uint minNumber) public view returns (uint amount) {
amount = uint(keccak256(abi.encodePacked(block.timestamp, msg.sender, block.number))) % (maxNumber-minNumber);
amount = amount + minNumber;
return amount;
}
Kido
Shawn Tabrizi
randomnumber
Variablen geändert habe. Sie sollten es anders als Ihren Funktionsnamen halten. Außerdem sollten Sieabi.encodePacked()
vor dem Hashing die 3 Werte verwenden, wie ich oben gezeigt habe.Kido
Shawn Tabrizi
Rob Hitchens
Kido
Yogesh - EtherAuthority.io
Rob Hitchens
Patrick Collins