64,654
社区成员
发帖
与我相关
我的任务
分享
/***
*rand.c - random number generator
*
* Copyright (c) Microsoft Corporation. All rights reserved.
*
*Purpose:
* defines rand(), srand() - random number generator
*
*******************************************************************************/
#include <cruntime.h>
#include <mtdll.h>
#include <stddef.h>
#include <stdlib.h>
/***
*void srand(seed) - seed the random number generator
*
*Purpose:
* Seeds the random number generator with the int given. Adapted from the
* BASIC random number generator.
*
*Entry:
* unsigned seed - seed to seed rand # generator with
*
*Exit:
* None.
*
*Exceptions:
*
*******************************************************************************/
void __cdecl srand (
unsigned int seed
)
{
_getptd()->_holdrand = (unsigned long)seed;
}
/***
*int rand() - returns a random number
*
*Purpose:
* returns a pseudo-random number 0 through 32767.
*
*Entry:
* None.
*
*Exit:
* Returns a pseudo-random number 0 through 32767.
*
*Exceptions:
*
*******************************************************************************/
int __cdecl rand (
void
)
{
_ptiddata ptd = _getptd();
return( ((ptd->_holdrand = ptd->_holdrand * 214013L
+ 2531011L) >> 16) & 0x7fff );
}
uint seed = 31;
/* 31 131 1313 13131 131313 etc.. */
uint hash = 0;
int len = src.Length;
for( int i = 0; i < len; i++ )
hash = (hash * seed) + src[i];
return (int)hash;
但这个比较是对一个数组求 hash 值的算法。但我的这个算法,应该和这个的原理上相仿。
我试着对已经抽取到的 n 字节求 hash,以决定下一个要抽取的值,则 result[ n + 1] = src[hash % src.length]
结果有非常多的重复。
基本思路上,只要种子不变,抽取结果不变。但要求随机挑选,则不知道怎么搞