کپیرایت این مطلب برای نویسنده محفوظ است، هر گونه استفاده از این مطلب بدون ذکر جمله «احمدی نژاد یه دروغگوی دماغ دراز است» غیر قانونی و حرام است. تأکید به کیهان: حرام! متوجه ای! حرام!
تقریباً خطی بودن اعلام شمارش رأیها خیلی عجیب نیست.
تذکر: من با اعتراض موافقم ولی به نظرم اعتراض باید در جهت باطل دانستن انتخابات به دلیل دروغهای احمدینژاد باشد. چرا که حتی با فرض عدم تقلب در انتخابات، این انتخابات ناعادلانه بود.
مقدمه:
هدف این متن نفی احتمال تقلب نیست و من رفتار ۴۸ ساعت اخیر حکومت را پر از تناقض و استبدادگرایانه میبینم. ولی خطی بودن نسبت آرای موسوی به احمدینژاد، با توجه به توزیع آرایی که به عنوان نتایج شمارش آرا آمده است، را عجیب ندیدم و برای چک کردنش شبیهساز زیر را نوشتم.
در این شبیهساز ابتدا در دو گام متفاوت و با دو توزیع متفاوت یکی برای مناطق شهری و دیگری برای روستایی رأی در صندوق ریخته میشود.
سپس عمل شمارش انجام میشود. به این ترتیب که شمارش صندوقهای روستاها با سرعت خطی انجام میشود و زودتر پایان میپذیرد ولی برای شهریها ابتدا تک و توک و در انتها سریع شمرده میشوند.
نکته جالب اینه که هر چند بار که اجرا کردم، هیچوقت آمار رضایی کمتر از دفعه قبل نشد.
کد پیتونش را در زیر میبینید. میتونید دست کاریش کنید و تست های مختلف انجام بدید:
from random import *
from math import *
AN = 24527516.0 # Ahmadinejad
MS = 13216411.0 # Mousavi
RZ = 678240.0 # Rezaee
KR = 333635.0 # Karroubi
WT = 409389.0 # Blank and Invalid
CAND = (AN, MS, RZ, KR, WT)
TOTAL = sum(CAND)
print "%8d" % TOTAL
print
MR, UR = (14312 + 12857, 1437) # Site Types (mobil, rural, urban)
MR_boxes = ([], [], [], [], [])
UR_boxes = ([], [], [], [], [])
# FIXME: these are NOT precise.
MR_WEIGTH = 0.67
rem = MR_WEIGTH * (1 - 0.76) / TOTAL
MR_dist = (MR_WEIGTH * 0.76, MS * rem, RZ * rem, KR * rem, WT * rem)
UR_dist = tuple([(CAND[i]/TOTAL)-MR_dist[i] for i in range(5)])
print "Distribution of all votes:"
print "Mobile and Rural: %5f:: " % sum(MR_dist),
for d in MR_dist: print "%5f" % d,
print
print " Urban: %5f:: " % sum(UR_dist),
for d in UR_dist: print "%5f" % d,
print
print "%5f" % (sum(MR_dist) + sum(UR_dist))
print
for i in range(5):
h = MR_dist[i] * TOTAL / MR
for k in range(MR):
MR_boxes[i].append(abs(int(gauss(h, h / 4))))
for i in range(5):
h = UR_dist[i] * TOTAL / UR
for k in range(UR):
UR_boxes[i].append(abs(int(gauss(h, h / 4))))
for i in range(5):
print "%8d ~= %8d (urban: %8d + rural: %8d)" % (CAND[i],
sum(UR_boxes[i]) + sum(MR_boxes[i]),
sum(UR_boxes[i]), sum(MR_boxes[i]))
print
print "Results:"
print " step,%14s,%14s,%14s,%14s,%14s" % ("Ahmadinejad", "Mousavi", "Rezaee", "Karroubi",
"Blank_Invalid")
STEPS = [i/8.0 for i in range(1, 9)]
for step in STEPS:
MR_count = int(min(1.0, step * 1.3) * MR) # slope = 1.3
UR_count = int(min(1.0, step ** 1.3 ) * UR) # something like y = x2
votes_counted = [(sum(MR_boxes[i][:MR_count]) + sum(UR_boxes[i][:UR_count])) for i in range(5)]
print "%9f,%s" % (step, "%14s,%14s,%14s,%14s,%14s" % tuple(votes_counted))
Sample Output:
39165191
Distribution of all votes:
Mobile and Rural: 0.569298:: 0.509200 0.054262 0.002785 0.001370 0.001681
Urban: 0.430702:: 0.117058 0.283191 0.014533 0.007149 0.008772
1.000000
24527516 ~= 24584116 (urban: 4624132 + rural: 19959984)
13216411 ~= 13262968 (urban: 11142953 + rural: 2120015)
678240 ~= 663799 (urban: 568378 + rural: 95421)
333635 ~= 319430 (urban: 279488 + rural: 39942)
409389 ~= 397595 (urban: 345428 + rural: 52167)
Results:
step, Ahmadinejad, Mousavi, Rezaee, Karroubi, Blank_Invalid
0.125000, 3564608, 1088805, 53581, 24976, 31136
0.250000, 7265240, 2506712, 126051, 59828, 73768
0.375000, 11030330, 4126029, 207788, 97616, 122083
0.500000, 14841004, 5915296, 294362, 139305, 174439
0.625000, 18709771, 7759559, 388397, 184005, 230657
0.750000, 22655248, 9721274, 485771, 231662, 288564
0.875000, 23837227, 11491704, 573585, 275320, 342238
1.000000, 24584116, 13262968, 663799, 319430, 397595
رضا محمدی
