Ich möchte eine Zufallszahl zwischen 100 und 999 wie folgt erhalten

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

Antworten (4)

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.

Cool!!!!!!!!!!!!
Übrigens, beachten Sie, wie ich den Namen Ihrer randomnumberVariablen geändert habe. Sie sollten es anders als Ihren Funktionsnamen halten. Außerdem sollten Sie abi.encodePacked()vor dem Hashing die 3 Werte verwenden, wie ich oben gezeigt habe.
Warum brauchen Sie "Sie sollten abi.encodePacked() verwenden, bevor Sie die 3 Werte hashen"?
Sie können sich hier einige Details ansehen: Deprecate variable argument mode of keccak256/sha256 . Letztendlich ist es die beste Vorgehensweise, dies auf diese Weise zu tun.
Vorsichtig sein. Diese Zufallszahl ist zu 100 % vorhersehbar und daher nicht für Glücksspiele oder Situationen geeignet, in denen ein Teilnehmer davon ausgeht, dass er sie nicht erraten kann.
@ShawnTabrizi Ich schicke dir eine E-Mail, bitte überprüfe sie.
@RobHitchens Ich suche überall. Irgendwelche Vorschläge zum Generieren von Zufallszahlen, die im Voraus erraten werden können? PS: Ich habe so ziemlich alles in Google gelesen. Immer noch keine zufriedenstellenden Antworten gefunden. Und wir wollen kein Orakel oder externe Quellen verwenden!! Vielen Dank im Voraus für Ihre Zeit :)
Betrachten Sie ein Commit/Reveal-Muster und fügen Sie nach dem Commit und vor dem Reveal mehr Entropie hinzu. Seien Sie äußerst vorsichtig und lassen Sie Ihren Code von mehreren qualifizierten Parteien überprüfen.
Schauen Sie sich das Chainlink VRF an, sonst können Sie von Minern angegriffen werden.

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;
}