#两种随机数抽取方法,第一种为指定区间,并在区间中可以刨除指定数,第二种为指定数序中抽取。每抽取一个数字进行全部洗牌。百度博客不再对外公开,转战这里了~
import os,random,sys
class element:
def __init__(self,forward,behind):
self.forward = forward;
self.behind = behind;
def __del__(self):
self.forward = None;
self.behind = None;
self.data = None;
def addPointer(self):
if self.forward != None:
self.forward.setBehindPointer(self);
def setBehindPointer(self,behind):
self.behind = behind;
def setForwardPointer(self,forward):
self.forward = forward;
def setData(self,num):
self.data = num;
def getBehind(self):
return self.behind;
def getForward(self):
return self.forward;
def getData(self):
return self.data;
def delete(self):
if self.forward != None:
self.forward.setBehindPointer(self.behind);
else:
if self.behind != None:
self.behind.setForwardPointer(None);
HeadPointer[0] = self.behind;
if self.behind != None:
self.behind.setForwardPointer(self.forward);
else:
if self.forward != None:
self.forward.setBehindPointer(None);
EndPointer[0] = self.forward;
def fromStrToNumList(NumStr):
rnum = [];
tnum = '';
for i in NumStr:
if ' ' == i:
if '' != tnum:
rnum.append(int(tnum));
tnum = '';
continue;
else:
tnum = tnum+i;
rnum.sort();
return rnum;
def printList(treeList):
#sys.stdout.write("%d "%(treeList.getData()));
print treeList.getData(), ;
while treeList.behind != None:
treeList = treeList.getBehind();
print treeList.getData(), ;
print "";
def Shuffle(treeList):
if sumNum == 1:
return;
for i in range(1,sumNum*2):
t1 = random.randint(0,sumNum-1);
t2 = random.randint(0,sumNum-1);
t1Pointer = t2Pointer = treeList;
#print "t1=%d t2=%d" % (t1,t2);
if t1==t2:
continue;
while t1>0:
t1Pointer = t1Pointer.getBehind();
t1 -= 1;
while t2>0:
t2Pointer = t2Pointer.getBehind();
t2 -= 1;
#print "t1p=%d t2p=%d" % (t1Pointer.getData(),t2Pointer.getData());
tNum = t1Pointer.getData();
t1Pointer.setData(t2Pointer.getData());
t2Pointer.setData(tNum);
if __name__ == "__main__":
print "@ by ShadowZ 2015/6/10";
mode = input("mode(1/2): ");
sumNum = 0;
CurrentPointer = element(None,None);
HeadPointer = [CurrentPointer];
EndPointer = [CurrentPointer];
if mode == 1:
start = input("Input start: ");
end = input("Input end: ");
if start >= end:
print "!!start must less then end!!";
exit(1);
selectNum = input("Randomly selected num: ");
removeNumStr = raw_input("remove num: ")+' '
removeNum = fromStrToNumList(removeNumStr);
#print removeNum;
elements = [];
for i in range(start,end+1):
CurrentPointer.addPointer();
#EndPointer[0] = CurrentPointer;
for r in removeNum:
if i == r:
i = -1;
del removeNum[0];
break;
if i == -1:
continue;
CurrentPointer.setData(i);
sumNum += 1;
CurrentPointer = element(CurrentPointer,None);
EndPointer[0] = CurrentPointer.getForward();
del CurrentPointer;
elif mode == 2:
assignNumStr = raw_input("Assign num: ")+' ';
selectNum = input("Randomly selected num: ");
assignNum = fromStrToNumList(assignNumStr);
for i in assignNum:
CurrentPointer.addPointer();
CurrentPointer.setData(i);
sumNum += 1;
CurrentPointer = element(CurrentPointer,None);
EndPointer[0] = CurrentPointer.getForward();
del CurrentPointer;
else:
print "!!this mode not define!!";
exit(1);
#printList(HeadPointer[0]);
deal = [];
for i in range(0,selectNum):
Shuffle(HeadPointer[0]);
choice = random.randint(0,sumNum-1);
CurrentPointer = HeadPointer[0];
while choice > 0:
CurrentPointer = CurrentPointer.getBehind();
choice -= 1;
deal.append(CurrentPointer.getData());
CurrentPointer.delete();
del CurrentPointer;
sumNum -= 1;
deal.sort();
print "result: ",;
for i in range(0,len(deal)):
print deal[i],