本文整理匯總了Golang中github.com/NebulousLabs/Sia/crypto.RandIntn函數的典型用法代碼示例。如果您正苦於以下問題:Golang RandIntn函數的具體用法?Golang RandIntn怎麽用?Golang RandIntn使用的例子?那麽, 這裏精選的函數代碼示例或許可以為您提供幫助。
在下文中一共展示了RandIntn函數的15個代碼示例,這些例子默認根據受歡迎程度排序。您可以為喜歡或者感覺有用的代碼點讚,您的評價將有助於係統推薦出更棒的Golang代碼示例。
示例1: newTestingFile
// newTestingFile initializes a file object with random parameters.
func newTestingFile() *file {
key, _ := crypto.GenerateTwofishKey()
data, _ := crypto.RandBytes(8)
nData, _ := crypto.RandIntn(10)
nParity, _ := crypto.RandIntn(10)
rsc, _ := NewRSCode(nData+1, nParity+1)
return &file{
name: "testfile-" + strconv.Itoa(int(data[0])),
size: encoding.DecUint64(data[1:5]),
masterKey: key,
erasureCode: rsc,
pieceSize: encoding.DecUint64(data[6:8]),
}
}
示例2: probabilisticReset
// probabilisticReset will probabilistically reboot the storage manager before
// continuing. This helps to verify that the persistence is working correctly.
// The reset is probabilistic to make sure that the test is not passing because
// of the reset.
func (smt *storageManagerTester) probabilisticReset() error {
rand, err := crypto.RandIntn(3)
if err != nil {
return err
}
if rand == 1 {
// Grab the potentially faulty dependencies and replace them with good
// dependencies so that closing happens without issues.
deps := smt.sm.dependencies
smt.sm.dependencies = productionDependencies{}
// Close the storage manager, then create a new storage manager to
// replace it.
err = smt.sm.Close()
if err != nil {
return err
}
// Open the storage manager with production dependencies so that there
// are no errors.
sm, err := New(filepath.Join(smt.persistDir, modules.StorageManagerDir))
if err != nil {
return err
}
sm.dependencies = deps
smt.sm = sm
}
return nil
}
示例3: threadedUploadPiece
// threadedUploadPiece will upload the piece of a file to a randomly chosen
// host. If the wallet has insufficient balance to support uploading,
// uploadPiece will give up. The file uploading can be continued using a repair
// tool. Upon completion, the memory containg the piece's information is
// updated.
func (r *Renter) threadedUploadPiece(host modules.HostSettings, up modules.FileUploadParams, piece *filePiece) error {
// Set 'Repairing' for the piece to true.
lockID := r.mu.Lock()
piece.Repairing = true
r.mu.Unlock(lockID)
// Try 'maxUploadAttempts' hosts before giving up.
for attempts := 0; attempts < maxUploadAttempts; attempts++ {
// Negotiate the contract with the host. If the negotiation is
// unsuccessful, we need to try again with a new host.
err := r.negotiateContract(host, up, piece)
if err == nil {
return nil
}
// The previous attempt didn't work. We will try again after
// sleeping for a randomized amount of time to increase our chances
// of success. This will help spread things out if there are
// problems with network congestion or other randomized issues.
r, _ := crypto.RandIntn(256)
time.Sleep(100 * time.Millisecond * time.Duration(r))
}
// All attempts failed.
return errors.New("failed to upload filePiece")
}
示例4: managedLogError
// mangedLogError will take an error and log it to the host, depending on the
// type of error and whether or not the DEBUG flag has been set.
func (h *Host) managedLogError(err error) {
// Determine the type of error and the number of times that this error has
// been logged.
var num uint64
var probability int // Error will be logged with 1/probability chance.
switch err.(type) {
case ErrorCommunication:
num = atomic.LoadUint64(&h.atomicCommunicationErrors)
probability = errorCommunicationProbability
case ErrorConnection:
num = atomic.LoadUint64(&h.atomicConnectionErrors)
probability = errorConnectionProbability
case ErrorConsensus:
num = atomic.LoadUint64(&h.atomicConsensusErrors)
probability = errorConsensusProbability
case ErrorInternal:
num = atomic.LoadUint64(&h.atomicInternalErrors)
probability = errorInternalProbability
default:
num = atomic.LoadUint64(&h.atomicNormalErrors)
probability = errorNormalProbability
}
// If num > logFewLimit, substantially decrease the probability that the error
// gets logged.
if num > logFewLimit {
probability = probability * 25
}
// If we've seen less than logAllLimit of that type of error before, log
// the error as a normal logging statement. Otherwise, probabilistically
// log the statement. In debugging mode, log all statements.
logged := false
rand, randErr := crypto.RandIntn(probability + 1)
if randErr != nil {
h.log.Critical("random number generation failed")
}
if num < logAllLimit || rand == probability {
logged = true
h.log.Println(err)
} else {
h.log.Debugln(err)
}
// If the error was logged, increment the log counter.
if logged {
switch err.(type) {
case ErrorCommunication:
atomic.AddUint64(&h.atomicCommunicationErrors, 1)
case ErrorConnection:
atomic.AddUint64(&h.atomicConnectionErrors, 1)
case ErrorConsensus:
atomic.AddUint64(&h.atomicConsensusErrors, 1)
case ErrorInternal:
atomic.AddUint64(&h.atomicInternalErrors, 1)
default:
atomic.AddUint64(&h.atomicNormalErrors, 1)
}
}
}
示例5: maybeCheckConsistency
// maybeCheckConsistency runs a consistency check with a small probability.
// Useful for detecting database corruption in production without needing to go
// through the extremely slow process of running a consistency check every
// block.
func (cs *ConsensusSet) maybeCheckConsistency(tx *bolt.Tx) {
n, err := crypto.RandIntn(1000)
if err != nil {
manageErr(tx, err)
}
if n == 0 {
cs.checkConsistency(tx)
}
}
示例6: fetch
func (f *testFetcher) fetch(p pieceData) ([]byte, error) {
f.nAttempt++
time.Sleep(f.delay)
// randomly fail
if n, _ := crypto.RandIntn(f.failRate); n == 0 {
return nil, io.EOF
}
f.nFetch++
return f.sectors[p.MerkleRoot], nil
}
示例7: fetch
func (f *testFetcher) fetch(p pieceData) ([]byte, error) {
f.nAttempt++
time.Sleep(f.delay)
// randomly fail
if n, _ := crypto.RandIntn(f.failRate); n == 0 {
return nil, io.EOF
}
f.nFetch++
return f.data[p.Offset : p.Offset+f.pieceSize], nil
}
示例8: fetch
func (h *testHost) fetch(p pieceData) ([]byte, error) {
h.nAttempt++
time.Sleep(h.delay)
// randomly fail
if n, _ := crypto.RandIntn(h.failRate); n == 0 {
return nil, io.EOF
}
h.nFetch++
return h.data[p.Offset : p.Offset+h.pieceSize], nil
}
示例9: randomNode
func (g *Gateway) randomNode() (modules.NetAddress, error) {
if len(g.nodes) > 0 {
r, _ := crypto.RandIntn(len(g.nodes))
for node := range g.nodes {
if r <= 0 {
return node, nil
}
r--
}
}
return "", errNoPeers
}
示例10: randomPeer
// randomPeer returns a random peer from the gateway's peer list.
func (g *Gateway) randomPeer() (modules.NetAddress, error) {
if len(g.peers) > 0 {
r, _ := crypto.RandIntn(len(g.peers))
for addr := range g.peers {
if r <= 0 {
return addr, nil
}
r--
}
}
return "", errNoPeers
}
示例11: Upload
// Upload adds a piece to the testHost. It randomly fails according to the
// testHost's parameters.
func (h *testHost) Upload(data []byte) (offset uint64, err error) {
// simulate I/O delay
time.Sleep(h.delay)
h.Lock()
defer h.Unlock()
// randomly fail
if n, _ := crypto.RandIntn(h.failRate); n == 0 {
return 0, errors.New("no data")
}
h.data = append(h.data, data...)
return uint64(len(h.data) - len(data)), nil
}
示例12: Upload
// Upload adds a piece to the testHost. It randomly fails according to the
// testHost's parameters.
func (h *testHost) Upload(data []byte) (crypto.Hash, error) {
// simulate I/O delay
time.Sleep(h.delay)
h.Lock()
defer h.Unlock()
// randomly fail
if n, _ := crypto.RandIntn(h.failRate); n == 0 {
return crypto.Hash{}, errors.New("no data")
}
root := crypto.MerkleRoot(data)
h.sectors[root] = data
return root, nil
}
示例13: Download
// Download downloads a file, identified by its nickname, to the destination
// specified.
func (r *Renter) Download(nickname, destination string) error {
lockID := r.mu.Lock()
// Lookup the file associated with the nickname.
file, exists := r.files[nickname]
if !exists {
return errors.New("no file of that nickname")
}
// Create the download object and spawn the download process.
d, err := newDownload(file, destination)
if err != nil {
return err
}
// Add the download to the download queue.
r.downloadQueue = append(r.downloadQueue, d)
r.mu.Unlock(lockID)
// Download the file. We only need one piece, so iterate through the hosts
// until a download succeeds.
for i := 0; i < downloadAttempts; i++ {
for _, piece := range d.pieces {
downloadErr := d.downloadPiece(piece)
if downloadErr == nil {
// done
d.complete = true
d.file.Close()
return nil
}
// Reset seek, since the file may have been partially written. The
// next attempt will overwrite these bytes.
d.file.Seek(0, 0)
atomic.SwapUint64(&d.received, 0)
}
// This iteration failed, no hosts returned the piece. Try again
// after waiting a random amount of time.
r, _ := crypto.RandIntn(i * i * 256)
time.Sleep(time.Second * time.Duration(r))
}
// File could not be downloaded; delete the copy on disk.
d.file.Close()
os.Remove(destination)
return errors.New("could not download any file pieces")
}
示例14: addPiece
func (h *testHost) addPiece(p uploadPiece) error {
// simulate I/O delay
time.Sleep(h.delay)
// randomly fail
if n, _ := crypto.RandIntn(h.failRate); n == 0 {
return crypto.ErrNilInput
}
h.pieceMap[p.chunkIndex] = append(h.pieceMap[p.chunkIndex], pieceData{
p.chunkIndex,
p.pieceIndex,
uint64(len(h.data)),
})
h.data = append(h.data, p.data...)
return nil
}
示例15: randomInboundPeer
// randomInboundPeer returns a random peer that initiated its connection.
func (g *Gateway) randomInboundPeer() (modules.NetAddress, error) {
if len(g.peers) > 0 {
r, _ := crypto.RandIntn(len(g.peers))
for addr, peer := range g.peers {
// only select inbound peers
if !peer.inbound {
continue
}
if r <= 0 {
return addr, nil
}
r--
}
}
return "", errNoPeers
}